你们使用扩展方法么?

boss_george 2014-10-30 06:03:23
因为要给6个已经写好的类共同添加方法,为了日后统一维护也好,偷懒也好,耍帅也好,我单独弄了个类,里面使用扩展方法的写法,给所有需要加方法的类增加了扩展方法,领导的反应是:你就爱用怪异的写法。

问问,代码之美?怪异写法?你们如何认为的?
...全文
431 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
smthgdin_020 2014-11-02
  • 打赏
  • 举报
回复
你用switch...case, 如果这段代码刚好是变化的代码,这么写显然违反设计原则。
smthgdin_020 2014-11-02
  • 打赏
  • 举报
回复
引用 22 楼 boss_george 的回复:
[quote=引用 18 楼 smthgdin 的回复:] 1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
感谢你的回复 但是呢,并不认可你所有回复 1,2,你这毫无说服力,如果可能,详细描述一下? 3.此处并不需要访问私有的,我做的设计,尽量都使用公开的属性。 4.我已经按照领导的做法修改了程序了。 a.不使用扩展方法,并很2的把生成的xml片段使用重写ToString的方式返回 b.不使用xml序列化方法,而且不使用XmlDocument,而是自己拼接几行类似xml的标签行 c.因为自创格式,所以无法用XmlDocument读取,只好自己用正则分析取回的数据 d.原本统一的一个处理,完全可以自描述的格式,现在已经拆开,需要一堆的switch...case了,Oh,yeah,我以前自认为是设计师,经过这个领导的“洗礼”,我终于知道“码农”和“设计师”之间思想的鸿沟以及“码农”为什么被称之为“码农”了,我惊人的发现,这样垃圾的写法,其实代码行增加了至少10倍,如果按代码行算工资,我已经可以比以前多拿很多奖金了,原来按代码行算收入是这类人!懂了![/quote] 一般来说,在不能使用继承或者不能改写源码的情况下,才建议使用扩展方法。滥用扩展方法会给项目的扩展性,维护性和版本控制等方面造成不利影响。主要影响如下: 扩展方法本身不能访问被扩展类的私有成员; 扩展方法优先级低,所以会被被扩展类的同名方法覆盖; 扩展方法不会被派生类继承,也不能重写; 扩展方法有就近原则。如果在你的程序里有两个一模一样的扩展方法,和使用类处于同一命名空间里的扩展方法会被调用。 具体的话,你要分析你的场景是否适合,是否会引起一些弊端。因为我们不清楚你的具体需求和代码。
beyondcj 2014-11-01
  • 打赏
  • 举报
回复
boss_george 2014-10-31
  • 打赏
  • 举报
回复
引用 18 楼 smthgdin 的回复:
1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
感谢你的回复 但是呢,并不认可你所有回复 1,2,你这毫无说服力,如果可能,详细描述一下? 3.此处并不需要访问私有的,我做的设计,尽量都使用公开的属性。 4.我已经按照领导的做法修改了程序了。 a.不使用扩展方法,并很2的把生成的xml片段使用重写ToString的方式返回 b.不使用xml序列化方法,而且不使用XmlDocument,而是自己拼接几行类似xml的标签行 c.因为自创格式,所以无法用XmlDocument读取,只好自己用正则分析取回的数据 d.原本统一的一个处理,完全可以自描述的格式,现在已经拆开,需要一堆的switch...case了,Oh,yeah,我以前自认为是设计师,经过这个领导的“洗礼”,我终于知道“码农”和“设计师”之间思想的鸿沟以及“码农”为什么被称之为“码农”了,我惊人的发现,这样垃圾的写法,其实代码行增加了至少10倍,如果按代码行算工资,我已经可以比以前多拿很多奖金了,原来按代码行算收入是这类人!懂了!
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
引用 17 楼 romanchaos 的回复:
AsEnumerable
使用AsEnumable无非就是想让他可以使用where或者select.. 但是数组本身就有了where,select方法啊.. 难道

 int[] a = new int[1] { 1 };
 var b = a.AsEnumerable().First();
 var c=a.First();
b就行 c就不行了?? 这又不是DataTable 得需要

DataTable dt = new DataTable();
var q = dt.AsEnumerable().Where(d => d.Field<int>("age") > 8);
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
引用 19 楼 phommy 的回复:
楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
如果没人回复就可以编辑.只要有人回复了 就不能编辑了...
引用 17 楼 romanchaos 的回复:
AsEnumerable
若若的问下 你知道AsParallel是什么意思不.......
phommy 2014-10-31
  • 打赏
  • 举报
回复
楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
smthgdin_020 2014-10-31
  • 打赏
  • 举报
回复
1.扩展方法的主要使用场景不是你这样的; 2.扩展方法有一定污染性; 3.扩展方法没法使用被扩展类私有成员; 4.其实你可以听下领导的看法(当然,有时候你领导技术不行的话会比较失望)。
romanchaos 2014-10-31
  • 打赏
  • 举报
回复
AsEnumerable
romanchaos 2014-10-31
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
原来没用,不过这2天用了1次,感觉萌萌大...

 public static string ToHexString(this byte[] data)
        {
            return string.Join("-", data.AsParallel().Select(d => d.ToString("X2")).ToArray());
        }
 public static byte[] ToByte(this string s)
        {
            return s.Split('-').AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
        }
瞬间感觉高大上有木有??? 还是很不错的...虽然我不知道这样用对不对.......
不要用AsParallel,用AsEnumable。
showjim 2014-10-31
  • 打赏
  • 举报
回复
扩展方法需要处理冲突问题,用好了是提高编码效率的利器。
约翰德鲁伊 2014-10-31
  • 打赏
  • 举报
回复
引用 1 楼 boss_george 的回复:
被领导这么一说,一点想干的欲望都没了,下午剩余1小时,看网页,混过去好了。
你这个心态不对。你要充分理解一下领导的语气意义。 领导的意思是:你就爱用怪异的写法,真可爱...........
by_封爱 版主 2014-10-31
  • 打赏
  • 举报
回复
原来没用,不过这2天用了1次,感觉萌萌大...


public static string ToHexString(this byte[] data)
{
return string.Join("-", data.AsParallel().Select(d => d.ToString("X2")).ToArray());
}
public static byte[] ToByte(this string s)
{
return s.Split('-').AsParallel().Select(x => Convert.ToByte(x, 16)).ToArray();
}






瞬间感觉高大上有木有???

还是很不错的...虽然我不知道这样用对不对.......





romanchaos 2014-10-31
  • 打赏
  • 举报
回复
引用 21 楼 diaodiaop 的回复:
[quote=引用 17 楼 romanchaos 的回复:] AsEnumerable
使用AsEnumable无非就是想让他可以使用where或者select.. 但是数组本身就有了where,select方法啊.. 难道

 int[] a = new int[1] { 1 };
 var b = a.AsEnumerable().First();
 var c=a.First();
b就行 c就不行了?? 这又不是DataTable 得需要

DataTable dt = new DataTable();
var q = dt.AsEnumerable().Where(d => d.Field<int>("age") > 8);
[/quote] 啊没留意到……我表达的意思就是AsParallel要慎用吧。
phommy 2014-10-31
  • 打赏
  • 举报
回复
引用 20 楼 diaodiaop 的回复:
[quote=引用 19 楼 phommy 的回复:] 楼主你为什么可以编辑帖子。。。好像也不是管理员啊 我编辑就说 您的权限无法使用此功能,请联系相关人员,获得使用此功能的权限,才可以使用。
如果没人回复就可以编辑.只要有人回复了 就不能编辑了...
引用 17 楼 romanchaos 的回复:
AsEnumerable
若若的问下 你知道AsParallel是什么意思不.......[/quote] 谢告知。。。 如果允许(比如你的类是自己的代码有完全的控制权),最好还是不进行扩展,而在类内部实现。至于调用方便问题,你定义个接口让这6个类都实现就好了
threenewbee 2014-10-30
  • 打赏
  • 举报
回复
扩展方法不宜滥用。 我们知道,接口和类继承有些共同点,但是接口不能在基类实现一些预置的方法,而这些方法独立出来似乎和接口本身又没有关联。扩展方法特别适合这个场合使用。 我强调的是,给一个类也好,接口也好,增加扩展方法,最好这两者都是一个开发者/团队所为,这样可以避免无谓增加扩展方法造成的函数名污染和可读性下降。
足球中国 2014-10-30
  • 打赏
  • 举报
回复
引用 7 楼 boss_george 的回复:
最终,下班后,领导指示:不要用XML序列化方法,而是每个类,自己写生成xml的代码。 真搞不懂,宁可大量的复制粘贴代码,看上去津津有味的。诶。郁闷。
如果你用xml序列化,估计以后后悔有的吃了。版本更新 时,当你的类更改,重构时,当你对用户已经有的数据再反序列化时,那时候去死的心都有。 写代码给自己看的,想怎么写都可以。但写代码给别人看时,最好你的写的代码是很多人都能看得懂的。
boss_george 2014-10-30
  • 打赏
  • 举报
回复
sp1234 感谢你的回复,办公室里,的确需要这样欠考虑,区别对待。
boss_george 2014-10-30
  • 打赏
  • 举报
回复
最终,下班后,领导指示:不要用XML序列化方法,而是每个类,自己写生成xml的代码。 真搞不懂,宁可大量的复制粘贴代码,看上去津津有味的。诶。郁闷。
fmonkey 2014-10-30
  • 打赏
  • 举报
回复
扩展方法应该说不要在代码中大量使用,因为大量使用意味着你的代码设计出现了问题 扩展方法主要是针对某一些类型来使用时较好,比如.net Framework中的IEnumerable接口的扩展
加载更多回复(5)
(题外话:从本次开始 我新增了jQuery EasyUI的专题页面 大家可以关注我的专题页来及时获取最新的EasyUI资源 专题页地址如下http:http://download.csdn.net/album/detail/343 同时也希望转载的那些朋友能保留我资源的说明及出处地址 我花那么多精力制作出来的 你们鼠标点两下就给我转走了还不注明出处 实在是不厚道 本来就是本着分享精神的 为的就是聚集一点人气和提供一个优良的环境来一起学习进步的 请不要抹杀掉我的热情 谢谢 )   时隔4个月之久 EasyUI终于迎来大版本更新了 本次更新内容诸多 除了常规维护外 还新增了3个新组件 都很实用 详细的可以阅读更新说明 里面给了详细的解读 另外 从该版本开始我将会逐步的将EasyUI官方以及第三方较好的插件API整合到API文档当中 并且会对这些插件做一些简单的Demo实现 存放到配套提供的程序包demo文件夹下 以便大家学习和使用 本期文档中将官方提供的所有附加插件的API都整理并存放到Extension节点下了 这些扩展的demo在附带的程序包中已经提供 可以用于参考使用 jQuery EasyUI 1 4版本更新内容: Bug(修复) menu:修复在删除一个菜单项的时候该菜单无法正确自适应高度的问题; datagrid:修复在datagrid宽度太小的时候“fitColumns”方法无法正常工作的问题 Improvement(改进) EasyUI的所有组件已经支持非固定 百分比大小的尺寸设置; menu:添加“showItem” “hideItem”和“resize”方法; menu:基于窗体大小自动调整高度; menu:添加“duration”属性 该属性允许用户自定义隐藏菜单动画的持续时间 以毫秒为单位; validatebox:添加“onBeforeValidate”和“onValidate”事件; combo:从该版本开始combo组件扩展自textbox组件(textbox是1 4中新增的组件); combo:添加“panelMinWidth” “panelMaxWidth” “panelMinHeight”和“panelMaxHeight”属性; searchbox:从该版本开始searchbox组件扩展自textbox组件(textbox是1 4中新增的组件); tree:添加“getRoot”方法 用于返回通过“nodeEl”参数指定的节点的顶部父节点元素 注意:官网的英文API中该函数的说明有误 其说明是none 无参数 实际这里是需要参数的 ; tree:添加“queryParams”属性; datetimebox:添加“spinnerWidth”属性; panel:添加“doLayout”方法 用于控制面板内组件的大小; panel:添加“clear”方法 用于清除面板内的内容; datagrid:允许用户设置百分比宽度的列(该功能真是千呼万唤始出来啊 ); form:添加“ajax” “novalidate”和“queryParams”属性; linkbutton:添加“resize”方法 New Plugin(新组件) textbox:该组件是一个增强的输入字段 它可以让用户非常简单的构建一个表单; datetimespinner:该组件是一个日期和时间的微调组件 它允许我们选择一个特定的日期或时间; filebox:filebox 该组件表单元素中用于上传文件的文件框工具组件 ">(题外话:从本次开始 我新增了jQuery EasyUI的专题页面 大家可以关注我的专题页来及时获取

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧