有一个demo想开去,程序员在写code的过程中应该想些什么。

学习c#匿名类的时候,写demo,开始只是两句code,后来一些想法逐步在我的脑海中出现,把这些想法写下来,一方面是见证自己的进步,另一方面也与大家分享如何写一个“优雅”的程序。

  class Program
    {
        public delegate void say(object word);
 
        public delegate int Add(int x, int y);
        public delegate int Sub(int x, int y);
        public delegate int Mul(int x, int y);
        public delegate int Div(int x, int y);
     
        static void Main(string[] args)
        {
            say sayResult = delegate(object word) { Console.WriteLine(word); };
 
            Add add = delegate(int x, int y) { return x + y; };
            Sub sub = delegate(int x, int y) { return x - y; };
            Mul mul = delegate(int x, int y) { return x * y; };
            Div div = delegate(int x, int y) { return x / y; };
 
            sayResult(add(5,6));
            sayResult(sub(5,6));
            sayResult(mul(5,6));
            sayResult(div(5,6));
        }
 
    }

作为一段代码,最基本的职能就是要完成功能。在这几句代码中简单的运用了匿名对象实现了加,减,乘,除的运算。但是看上去这段代码有很多相似的语句,在各方面都有很大的提升余地,首先就拿那5个委托开刀,观察4个委托的形式,有相同的签名,相同的返回类型。C#提供了一些做好的委托类型(Action,Func),事实上并不需要我去定义什么。

 Action<object> sayResult = delegate(object word) { Console.WriteLine(word); };
 
            Func<int, int, int> add = delegate(int x, int y) { return x + y; };
            Func<int, int, int> sub = delegate(int x, int y) { return x - y; };
            Func<int, int, int> mul = delegate(int x, int y) { return x * y; };
            Func<int, int, int> div = delegate(int x, int y) { return x / y; };
 
            sayResult(add(5,6));
            sayResult(sub(5,6));
            sayResult(mul(5,6));
            sayResult(div(5,6));

这样在代码量上面就可以少了5行,但是4个匿名函数在形式和功能上都有一定的相关性,思考集成这4和匿名函数。

这是我开始的想法:

List<Func<int, int, int>> Caculate = new List<Func<int, int, int>>();
            Caculate.AddRange(new Func<int, int, int>[] { add, sub, mul, div });
            sayResult(Caculate[0](5, 6));

很明显代码的长度增加了,多了新的数据成员,在对效率要求不是那么严格的代码中,牺牲代码的长度来换取更好的结构,我认为还是很划算的。但是list中的索引方式不便于使用,假如这个程序集被引用,并不能从单纯的数字上看出什么来。严格的顺序也会增加出错的几率。因此,修改后的代码是这样的:

 Dictionary<string, Func<int, int, int>> Cacular = new Dictionary<string, Func<int, int, int>>();
            Cacular.Add("add", add);
            Cacular.Add("sub", sub);
            Cacular.Add("mul", mul);
            Cacular.Add("div", div);
            sayResult(Cacular["add"](5, 6));

代码再度加长,Dictionary并没提供addrange这种方法。如果需要拓展更多的操作,可以为Dictionary扩展方法addrange来获取更好的可读性。鉴于这是个demo,并未做这方面的工作,现在可以获得更好的集成和可读。说到集成,还有什么能比class更加引人注目呢?Dictionary在这方面太乏力了,首先在代码量上做出了让步,也不能提供智能提示的支持,依旧需要相关的文档支持,才能明晓“键”的含义。是时候将它升格成类了。

public static class Caculate
    {
       public static Func<int, int, int> add = delegate(int x, int y) { return x + y; };
       public static Func<int, int, int> sub = delegate(int x, int y) { return x - y; };
       public static Func<int, int, int> mul = delegate(int x, int y) { return x * y; };
       public static Func<int, int, int> div = delegate(int x, int y) { return x / y; };
}

这里我把运算这4个操作放到caculate类中sayResult独立出去,因为它们并不没有紧密的关系,我又想让这个类 能够支持更多的数据类型,

public static class Caculate<T>
    {
       public static Func<T, T, T>  add = delegate(T x, T y) { return x + y; };
       public static Func<T, T, T>  sub = delegate(T x, T y) { return x - y; };
       public static Func<T, T, T>  mul = delegate(T x, T y) { return x * y; };
       public static Func<T, T, T>  div = delegate(T x, T y) { return x / y; };
}

能这样写多好,可惜泛型不能用于运算符。通过百度获得一个类似的实现。

public static class Cacular<T> where T : struct
    {
 
        public static Func<T, T, T> add = delegate(T x, T y)
        {
            T result = default(T);
            Type type = x.GetType();
            string s = type.ToString();
            switch (type.ToString())
            {
                default: break;
                case "System.Int32":
                    result=  (T)(object)((Int32)(object)x + (Int32)(object)y);
                    break;
                case "System.Single":
                    result = (T)(object)((Single)(object)x + (Single)(object)y);
                    break;
                case "System.Double":
                    result = (T)(object)((double)(object)x + (double)(object)y);
                    break;
            }
            return result;
        };
        public static Func<T, T, T> sub = delegate(T x, T y)
        {
            T result = default(T);
            Type type = x.GetType();
            switch (type.ToString())
            {
                default: break;
                case "System.Int32":
                    result = (T)(object)((Int32)(object)x - (Int32)(object)y);
                    break;
                case "System.Single":
                    result = (T)(object)((Single)(object)x - (Single)(object)y);
                    break;
                case "System.Double":
                    result = (T)(object)((double)(object)x - (double)(object)y);
                    break;
            }
            return result;
        };
        public static Func<T, T, T> mul = delegate(T x, T y)
        {
            T result = default(T);
            Type type = x.GetType();
            switch (type.ToString())
            {
                default: break;
                case "System.Int32":
                    result = (T)(object)((Int32)(object)x * (Int32)(object)y);
                    break;
                case "System.Single":
                    result = (T)(object)((Single)(object)x * (Single)(object)y);
                    break;
                case "System.Double":
                    result = (T)(object)((double)(object)x * (double)(object)y);
                    break;
            }
            return result;
        };
        public static Func<T, T, T> div = delegate(T x, T y)
        {
            T result = default(T);
            Type type = x.GetType();
            switch (type.ToString())
            {
                default: break;
                case "System.Int32":
                    result = (T)(object)((Int32)(object)x / (Int32)(object)y);
                    break;
                case "System.Single":
                    result = (T)(object)((Single)(object)x / (Single)(object)y);
                    break;
                case "System.Double":
                    result = (T)(object)((double)(object)x / (double)(object)y);
                    break;
            }
            return result;
        };   
}

如他所言,这确实是个笨方法,如果有合适的方法,希望联系我。这个类问题老多了,拓展性,可维护都很糟。

现在发现建立个良好的类还是有相当的难度,不仅需要充分考虑当前需要实现的功能,也要考虑将来可能需要拓展的功能,对上兼容,对下拓展,良好的结构,精简的代码。

时间: 2024-08-24 09:12:04

有一个demo想开去,程序员在写code的过程中应该想些什么。的相关文章

一个优秀的c++程序员应该具备的素质

1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programming Language>和<Inside The C++ Object Model>,不要因为他们很难而我们自己是初学者所以就不看: 4.不要被VC.BCB.BC.MC.TC等词汇所迷惑--他们都是集成开发环境,而我们要学的是一门语言: 5.不要放过任何一个看上去很简单的小编程问题--他们

如何成为一个牛逼的程序员

“成为一个杰出的程序员!”,每个程序员都是这么想的,虽然嘴上不说!这是一个人人自称“屌丝”,骨子里却都认为自己是“高富帅”(或者认为自己终究会成为高富帅)的年代! 大部分时候,我们一直在努力成为一名优秀的程序员.但是,更多的时候,我们并不知道如何成为一个优秀的程序员! 怎样成为一个优秀的程序员? 完美主义?注重细节?懂用户需求?恩,听起来都有道理,但又觉得很虚,难以实施! 选(fang)择(fa)比努力重要,一味只会埋头苦干的人,注定成不了杰出的程序员,有时候,我们需要停下来:思考! 我不是一个

做一个有脑子的程序员

程序员是最理性的一个群人,除非面对电子产品的时. 程序员是一群高智商的群体,唯一的缺点就是发际线总是很难防守. 程序员是一群情商比较低的人群,常常看到程序员仅仅因为对技术的理解不同而大吵起来. 程序员常常是一群豁达的人,今天大吵一架明天接着聊代码. 但今天要讨论的却是,做一个有脑子的程序员. 有一个朋友也开了公众号,偶尔写写自己对技术的理解,平时也没怎么宣传,所以同事都不知道.有一天一个同事问他一个关于微服务的问题,刚好他前两天研究了这块,就将公众号中的文章分享给了同事. 同事看完之后解决了问题

资深大牛分享:一个合格的Java程序员如何成长为优秀的架构师

踽踽独行上下求索总是痛苦,如果有良师益友陪伴点拨必能事半功倍.从新手码农到高级架构师,要经过几步?要多努力,才能成为为人倚重的技术专家?本文将为你带来一张程序员发展路径图,但你需要知道的是,天下没有普适的道理,具体问题还需具体分析,实践才能出真知.资深大牛分享:一个合格的Java程序员如何成长为优秀的架构师如果大家如果在自学遇到困难,想找一个java的学习环境,可以加入我们的java学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题. 我认为,架构师的内功主要包含三部分:判断力.执

如何不被程序员嫌弃——写给那些血气方刚的产品经理

进入微软.亚马逊,谷歌等美国IT企业工作人才项目,起薪40万,百度搜索(MUMCS) 最近有位刚做 PM(产品经理)的小伙跑来跟我控诉,说公司技术部的 RD 们(程序员)个个不给力.需求过了千百遍还是理解错,或者就是简单回一句"做不了",表情如死灰. 这位 PM 血气方刚,张牙舞抓,脑子里总有一千万个新产品需求的想法扑腾着.他咄咄不停的抱怨 RD 们不配合,能力差,懒惰,没思考能力,没品位,顺带连抠脚味儿太大这种事也强烈谴责了."擦,老子明天就去学编程!" 哎,我发

程序员如何写出一份好的文档?

写文档的重要性 对于软件相关行业,在学校或单位大家也许都已经注意到了,除了要编写的程序.绘制设计图之外,还有一个重要的工作便是写文档.为什么要写文档呢?因为我们要把自己做的东西展示出来,不光展示给同行看,可能还要展示给其他岗位上的工作人员看,甚至展示给用户看.如果我们只是会写程序,不会在文档中恰当且优雅地描述自己的想法,那么就真正的成为“码农”了. 我注意了一下,周围的同事会写高质量文档的确实很少.李开复老师在<浪潮之巅>的序言中说到:“我认识很多顶尖的工程师,但具备强大叙事能力的优秀工程师,

[转]为什么程序员总是写糟糕的代码?这3个原因

原文请看:为什么程序员总是写糟糕的代码?这3个原因 我最近一直在想我们作为一个行业为什么总是产出糟糕代码的原因. 1.明显原因…… 我一下子想到的最明显的原因是,有好的程序员,也有不那么好的程序员,有的人技术水平高,有的人水平却低,有人对这门技艺感兴趣,但也有的人却不愿意在工作之外学习其他. 好了,我就不深入探讨了. 那么是不是在这表层之下还有更多的问题呢?有没有导致糟糕代码的根本性原因?我觉得有必要深入探究一下. 2.低预期…… 对于这一点,众所承认的是,我们在大学中,通过自学或书籍学到的东西

程序员老鸟写sql语句的经验之谈

做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为公司衡量程序员技术水平的标准. 我们程序员不是dba,不需要时刻关注sql运行时间,想方设法优化表结构,存储空间,优化表读取速度等等,但是在开发系统时,时刻保持优良的写sql语句的作风是很有必要的,这关乎到个人在公司的声誉,嘿嘿,你懂的... 新来的程序员老鸟,在一个开发团队中,需要表现一下自己的水

程序员工资高,却有很多人想转行,理由很简单!

这些年各大互联网公司曝光的一些员工收入水平来看,程序员的工资还是相对比较高的,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别是大龄程序员,这可能会令很多人纳闷.为什么工资这么高还想转行呢?其实也很无奈,从下面几点可以看得出来. #1.程序员加班多,经常熬夜 IT行业是一个工作节奏非常快的行业,项目越快上市,就能更快一步抢占商机,为了加快项目的进度,项目的计划时间安排也是相当紧张,所以程序员加班是经常的事,导致加班多还有一些其他的原因,我们设计好项目的需求以后,为了适应用户或者客户