实习总结:c#开发之旅(二)善用ref和out,让函数使用起来更方便。

以前使用java编写功能函数的时候,总感觉模块之间的耦合和模块之间的数据传递的便利,两者有点鱼与熊掌不可兼得

比如我在ReadCameraFile类中读取出camera参数数据,保存在类成员变量——arraylist中,其他类通过对象去获取这个arraylist,那么这两个类的耦合就有点高了,而且还有一个弊端就是,用arraylist保存数据,那么取出的时候,也要严格按照存入的顺序取出,比如我第一个数据是片号,第7个数据是X3的值,存取过程繁琐易出错?用map同样如此,key的值没有提示,取数据的人,同样不知道map里面有哪些key?这样以后开发大型应用的时候,很可能会乱套,而且反复的装箱和拆箱,程序性能也难免会受到影响。

     善用ref和out

     感觉out真的是很有用的一个东西,我分析了李哥的代码,发现他可以把很多功能函数写成静态类型,这样函数的调用更加直观和简洁,避免了像我那样反复的数据封装、传递、拆分、解析。

比如获取路径,在其他类中定义public static long BrowseFile(refstringfilePath,stringext)

 

Ui模块直接使用ref得到路径string,让ui模块的功能更加简洁

 

还有           (输入参数文件地址,返回解析出来的数据)

   public static bool ReadCameraInfo(string cameraFile,out doublef, out doublex0, outdouble y0,

            out double d, outdoublew, out double l)

这个函数,将数据的读取、解析和保存完全分开了,函数只负责读取和分析数据,将需要的数据通过out返回,至于数据的保存,则完全交给函数调用者(也即参数声明者)去管理,这样两边都省心省事,需要传递哪些数据,通过函数的签名也是一目了然,out的使用,达到了一次返回多个值的效果。

这里不得不吐槽下,记得某此我在网上问被人,如何让java函数一次返回多个值,结果被各种喷。有的说我功能设计有问题,有的说返回一个map。

这里我必须强烈反对使用map封装多个返回值,这会让调用者很难过,这造成了模块之间逻辑上的耦合,比接口,引用造成的耦合更可怕。

考虑良久,貌似只有封装一个javabean是比较好的选择,各种getParaName。但如果系统中这种数据比较多,也麻烦,而且为这么点小事new来new去的,感觉也很浪费资源。

 这算是java相比c#的一个缺陷吧。


    

posted @ 2013-03-07 09:51  碎景  阅读(180)  评论(0编辑  收藏  举报