返回首页

|:一个很多无事(或null)
我相信你写的代码应该表达的方式,几乎像一个story.nbsp读取您想要的功能,要做到这一点,你需要使用的编码风格,包括方法,属性和字段的描述性名称。 的一个领域,很多人不考虑自己的代码说,当他们使用在C#或没有在VB.nbsp空; 使用不当,它可能会导致代码混乱和微妙的错误。
因此,让我们的空使用代码开始英语翻译和研究一些代码成语。初始化变量为null
这是最简单的语句:

ISpoon aSpoon = null;

这意味着:"我可能要使用勺子,在一些点,在这个类或方法,但我已决定哪一个,都没有得到,或没有做了一个??NBSP另一个说,这是"有没有勺子??
公告,该变量定义在接口ISpoon方面。这样做的原因是,有许多不同类型的勺子(银,咖啡,糖,服务,木,??,我想对于一个给定的情况下能够使用最合适的。分配到一个变量的空
故事下面的代码:{C}
在这种情况下你必须得到一个勺子和使用it.nbsp;转让说"我做这个勺子,并不在乎它anymore.nbsp的,我就砸的地方,并清理船员(在。NET垃圾收集器)会选择它,洗它,并把它放回去,别人可以用它吗??从一个方法返回NULL
方法通常会返回单个值或values​​.nbsp收集;对于返回单值的方法,则返回null,将意味着不同的东西取决于method.nbsp的目的,例如,
ISpoon aSpoon = GetAWoodenSpoonFromTheDrawer();

将意味着我认为没有哪的drawer.nbsp木勺,现在你将有检查aSpoon是不是在使用它之前的空,并选择不同类型的勺子,或得到木勺elsewhere.nbsp我个人觉得这种类型的代码削弱代码的故事流,宁愿抛出exceptionnbsp;作为例外可以告诉你什么去wrong.nbsp;因此,而不是
ISpoon aSpoon = GetAWoodenSpoonFromTheDrawer();



// couldn't get a spoon from the drawer

if (aSpoon == null)

    aSpoon = FindAWoodenSpoonElsewhere();



// use the spoon if one was found.

if (aSpoon != null)

{

    ...

}

我会写
ISpoon aSpoon = null;

try

{

    ISpoon aSpoon = GetAWoodenSpoonFromTheDrawer();

}

// there isn't a spoon in the drawer

catch (NoSpoonFoundException)

{

    // look elsewhere

    try

    {

        aSpoon = FindAWoodenSpoonElsewhere();

    }

    // No spoon found anywhere

    catch(NoSpoonFoundException)

    {

        aSpoon = BuyAWoodenSpoon();

    }

}

// there was a spoon, but it was dirty

catch(DirtySpoonException)



{

    WashDishes();

    aSpoon = GetAWoodenSpoonFromTheDrawer();

}



 



// use the spoon if one was found.

if (aSpoon != null)

{

...

}

的情况下,该方法返回在项目的集合,
ICollection<ISpoon> mySilverSpoons = GetAllSpoonsThatAre("silver");

返回一个空不说"有没有汤匙 ??相反,它说:"我无法创建勺集合 ??在这种情况下,我将返回一个集合与任何项目。 像以前一样,错误应该抛出例外。这意味着您可以安全地遍历集合returned.nbsp;使用模式会是什么样子:
try

{

    ICollection<ISpoon> mySilverSpoons = GetAllSpoonsThatAre("silver");



    foreach(var spoon in mySilverSpoons)

    {

        Polish(spoon);

    }

}

catch(MissingSilverwareBoxException)

{

    CallPolice();

}

catch(NoPolishAvailable)

{

    Order("Polish");

    Reschedule("Polish Silver Task");

}

由于时间所限,我不会以解决在这个博客null参数。
我希望这给你的东西去思考架构/设计你applications.nbsp;只记得什么(或null)可以伤害你,如果你不想想没什么。

回答

评论会员:游客 时间:2012/01/25
我明白,有人认为编程结构的语义。我这样做了一段时间的自己,使我们的软件更可读和人类理解的。但我有其他有关空值,参数以及函数返回的意见。请考虑人P=loadedPersons.Find("迈尔");你不会使用异常的信号,即人是还没有在高速缓存?返回null是正确的答案在这里。在一般情况下,无论是空应允许或不取决于合同:-时,"未发现"等合同的一部分,也就是说,它是完全有效的功能可能无法找到,则返回null是唯一正确的决定。-函数不能履行合同时,那么它必须不返回任何东西,甚至没有空。的方式来表达,这是例外。对于第一种情况的例子:人P=loadedPersons.Find("迈尔");例为第二种情况:int结果=calculateSquareRoot(-1);感谢daProgramma
马修丹尼斯
评论会员:游客 时间:2012/01/25
我同意。如果可能的话,在正常流动的过程中尝试并获得/创建一个对象,没有对象,则返回null。例外应该只用于特殊情况。对于你的例子,返回null说,"有没有这个名字的人"。然而,根据收集/仓库实现,您可能会得到一个KeyNotFoundException,您可能需要处理,以防万一。您也可能由于数据库错误,超时,违反业务规则,等的其他例外所以我想在这里的教训是,如果它自己的代码,你可以做到这一点无论哪种方式,但如果你是使用他人库提供,阅读手册,如果它抛出异常或不明确,他们早日赶上要么重新抛出,或返回一个空马修
DaProgramma
评论会员:游客 时间:2012/01/25
马修丹尼斯写道:对于你的例子,返回null说,"有没有这个名字的人"。然而,根据收集/仓库实现,您可能会得到一个KeyNotFoundException,您可能需要处理,以防万一。第如果没有找到一个名字为查找功能的有效结果,让KeyNotFoundException肯定会是一个错误。使用一个容器,它抛出,如果事情是没有找到将是一个原因,程序员和我之间的一些谈话。另一件事是,等(编程)错误发生。但对方不应该应付该错误-他们应该静静地泡一些中央的顶层控制功能(主要是消息循环)这样的逻辑错误,应处理。花一些时间想一想:-如果情况是可以预料的,使用的例外是不正确的的模型。-"意外"的事情(主要是逻辑错误),例外的语言手段来使用。但:大多是没有意义的,以处理他们一个级别。-大部分时间是最好的处理他们非常顶级。当我看到有人在代码处理异常深刻,它主要是糟糕的设计。您也可能由于数据库错误,超时,违反业务规则,等的其他例外肯定。但是,这个线程是关于空值作为返回值,而不是例外的可用性。感谢daProgramma
CurtainDog:我真的很喜欢读你的文章!我同意,代码应该讲一个故事。

(未成年人)的负面影响,你的一些例子太罗嗦,可以使用一点点的面向对象的喜欢"。例如GetWoodenSpoonFromDrawer()drawer.get(Spoon.Wooden)更好。此外,当勺子垃圾收集器,它是没有很好地清洗和重用* *实际上是在扔进垃圾桶。
这个故事的寓意是,清洗和重用(即缓存和池)时,你可以。
可以找到一个很好的问题(虽然从另一个侧面)
评论会员:马修丹尼斯 时间:2012/01/25
其实,时的东西是垃圾收集的,它是不扔出去,它打破做其基本组成部分(通常是内存)和返回的部分后来被重用,使别的东西的适当池。因此,在客场,其最终清洗和重用。

然而,昂贵创建的对象,明确缓存和池的路要走。不过,我不会做这最初,只有当性能问题(测量或使用,而不是直觉发现)或稀缺资源的使用需要。

如果您需要缓存和重用,然后Dispose模式(这是完全支持using语句在C#)可能是要走的路。然后,代码看起来像这样:

using (var aSpoon = GetAWoodenSpoon() )

{

    // use the spoon to stir soup, hit apprentise, ...

}

当然,ISpoon接口需要继承IDisposable接口和WoodenSpoon类whould需要实现它。

有时候,我觉得一次性名称是一个不错的选择,尤其是在像勺子层次的情况下,我认为,PlasticSpoon对象应该是一次性的,WoodenSpoon对象WashAndReusable。但是,这仅仅是创建另一个类似的界面,或从IDisposable派生。一个有趣的想法去探索... ...
马修
评论会员:Micke 时间:2012/01/25
如果在一个正常的工作流程是勺的,你不应该使用异常沟通,向来电者。一个更好的想法可以返回一个ISpoon代表空和铸造到NullSpoon时,你可以调查的原因,由一个枚举告诉你,如果我们的勺子或所有的勺子都脏了。

关于
/ Micke
评论会员:马修丹尼斯 时间:2012/01/25
Micke,

我同意,正常,预计流量或进程流的条件是什么,不应该使用异常。特殊情况下例外。

我有点做作的例子,正常的过程,总是有匙。厨师搅拌他们的汤,否则有麻烦。洗碗机和apprentises应保持一切准备就绪,因此,出勺特殊和不寻常的任务进行。

你也是正确的,返回一个实例,通常一个类的静态,代表空,或错误的,条件也是一个可行的选择,则返回null

马修