|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
归根到底,net网页编程跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!成绩:
每当构想我的程序时,我常常会有以下连续串的思索:
一个足球队是一群足球活动员的汇合,因而,我能够用上面的代码来声明:
1
varfootball_team=newList<FootballPlayer>();
这个list的排序按次就是这些活动员在混名册里的按次。可是以后我又意想到除活动员外,球队另有其余属性也必要纪录。好比说这个赛季的总得分,以后的预算,球服的色彩,用string范例暗示的球队名字,等等。
以是我以为:
既然一个球队就是一群活动员的汇合,可是分外的,它有一个名字(string范例)和一个以后总得分(int范例)。.NET没有供应一个用来存储球队的类,以是我得本人界说一个类。和现有布局最靠近的是List<FootballPlayer>,以是我将承继它:
1
2
3
4
5
classFootballTeam:List<FootballPlayer>
{
publicstringTeamName;
publicintRunningTotal
}
可是了局是,我被提醒不克不及承继List<T>。关于这个提醒,我有两点困惑:
为何不克不及?
明显List某种水平是对功能的优化,怎样做到的?假如我承继了List对功能会有甚么影响?究竟带来了甚么?
别的,List是微软供应的,我不克不及把持它,当它对外界表征为“publicAPI”我就不克不及修正它。可是我很难了解甚么是PublicAPI,为何我要体贴它?假如我的项目不必要大概基本没有如许的publicAPI,我是否是就能够忽视谁人提醒?假如我不承继List那末我便必要一个PublicAPI,我该怎样办理?为何它这么主要呢,一个list就是个list,有甚么大概改动的呢?我大概想要改动甚么呢?
最初,假如微软不但愿我承继List,为何不给List类加sealed润色符呢?
除此以外我该利用甚么?
明显,关于自界说的汇合,微软供应了能够承继的Collection类来代替List。可是这个类功效很少,没有供应良多有效的工具,好比说AddRange。
承继Collection比承继List要多做良多活,并且我找不到长处。微软必定不会告知我往做分外的活,以是我以为某种水平上我曲解了甚么,并且实践上关于我的成绩承继Collection也不是一个好的办理计划。
我也看到一些办理计划,好比完成IList。可是我不会这么做,几十行的典范代码让我以为甚么用途也没有。
终极,一些人倡议我这么利用List:
1
2
3
4
classFootballTeam
{
publicList<FootballPlayer>Players;
}
可是这么做有两个成绩:
1.它使我的代码变得不用要的冗杂。我必定要挪用my_team.Players.Count而不是my_team.Count。感谢的是,用C#我能够界说索引器来创立索引,然后传送List中的一切外部办法。可是我要写良多代码。做那末多的活我失掉了甚么?
2.这只是埋怨没有其余意义。一个足球队不是包括一组活动员,它就是一组活动员。你不会说JohnMcFootballer已到场了某个球队的活动员汇合里,你会说JohnMcFootballer到场了某个球队。你不会说把一个字母到场到一串字符串的字母汇合里,你会说把一个字符到场一串字符串里。你不会说把一本书放到一个藏书楼的图书汇合里,你会说把一本书放到一个藏书楼里。
我入手下手意想到为何会如许了,实在能够说成“把x增加到y的外部汇合里”,可是如许的体例思索天下仿佛是违反常理的。
我的成绩(总结)
用C#表达逻辑(也就是说,从人类的思索体例)是list之类的带有钟声和口哨的数据布局,准确的办法是甚么?
是否是承继List<T>一向不会被承受?大概说甚么时分能够?为何能或不克不及?当决意是不是承继List<T>,一个程序员必要思索甚么?
最好谜底:(来自EricLippert,他是微软的一位资深软件计划工程师,之前伯乐在线翻译过他的一些博文)
已有良多很好的谜底,我很愿意在他们的基本上增补几点。
用C#表达逻辑(也就说说,从人类的思索体例)是list之类的带有钟声和口哨的数据布局,准确的办法是甚么?
让恣意十个非盘算机程序员而且熟习足球的人来填写上面这句话的空缺处:
一个足球队是一种特定的__________
有任何一团体写“带有钟声和口哨的活动员汇合”吗,大概仍是都写“活动队”、“俱乐部”、“构造”?足球队是一种特定的活动员汇合这个观点只是你年夜脑中的设法而且也只是你罢了。
List<T>是一种机制。足球队是一种贸易对象——也就是说,在程序中,这类对象是在营业逻辑范畴中的一种观点。不要搅浑了这些。足球队就是一个团队,它有一个混名册,混名册是一组活动员汇合。它就是活动员的汇合。以是界说一个属性叫Roster暗示List<Player>,而且当你利用时,界说成
1
ReadOnlyList<Player>
除非你以为每一个人都能够失掉球队的混名册而且能够从中删除队员。
是否是承继List<T>一向不会被承受?
不克不及被谁承受?我吗?不是。
甚么时分能够?
当你必要创立一种必要承继List<T>机制的机制的时分。
当决意是不是承继List<T>,一个程序员必要思索甚么?
我是在创立一种机制仍是创立一个营业对象?
我要写良多代码。做那末多的活我失掉了甚么?
你花了大批的工夫把你的成绩敲打出来,这个工夫已够你把与List<T>相干联的成员办法写上50遍以上了。明显你是不怕冗杂的,我们在这里会商的只是几行代码,这是几分钟的事情。
更新
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似net网页编程那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。 |
|