文档章节

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

魂祭心
 魂祭心
发布于 2015/08/17 18:08
字数 1444
阅读 108
收藏 5

学习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#提供了一些做好的委托类型(ActionFunc),事实上并不需要我去定义什么。

 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;
        };   
}

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

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


© 著作权归作者所有

魂祭心

魂祭心

粉丝 13
博文 53
码字总数 88077
作品 0
浦东
后端工程师
私信 提问
Unity实现在白板上绘画涂鸦

前言 有段时间没有更新博客了,不知道应该写些什么,太简单感觉没有记录的必要,太难自己都没能理解,不知道如何下手。回归初心,记录自己想记录的东西。 需要实现一个白板绘画的功能,可以使...

qq992817263
2017/12/03
0
0
写最少的代码,避免给自己找麻烦

软件开发的一个最基本的事实是:我们必须要写代码,但对于这样的一个事实的最大一个误解是:我们的工作就是写代码。作为软件程序员的最初几年,我一直被这样的思想所迷惑,写代码是一种很强的...

oschina
2012/07/09
3.2K
17
JFinal源码分析------Model的前世今生

嗯 好了 前几篇博文,我们主要是说一些初始化的东西,现在,我们可能需要看看另外的东西了,也就是关于和数据库相关的东西了。在Demo中的,我们最想接触到的除了Controller,Config之外的东西...

天蓬小猪
2013/06/13
3.7K
7
关于程序员生涯的思考,30 岁以后的码农们该何去何从?

程序员 岁月是一把杀猪刀,码农们随着年纪越来越大,头发越来越少,精力已远远不如从前,这些码农该何去何从呢? 我 18 岁入行,呆过国企,也呆过创业公司,虽然现在我还很年轻,精力也很充沛...

angkee
2018/01/06
0
0
学会这几点,你会成为一名月薪过万的Java程序员

每一个稍微有点出息的人,都应该把行业里的前三名作为自己奋斗的目标和对手。你离成为冠军Java程序员还有多远,看完这篇你就知道了。 软件工程师的职业生涯里,知识有一个三年的半衰期。这意...

梦想远方_8e96
2018/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
55分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部