如果您同意这样一种观点,即您需要能够区分没有值和值本身之间的区别,那么这会对您编写的代码产生一些影响。如果你想保持';em分离(这样他们就可以出来玩了),然后它让你以特定的方式审视你的API设计。
以下是我对返回(或不返回)值的一些方式的反应。
想象一下我们';我们说的是一个助手函数,它要在一个程序中运行,这个程序';它处理对网页的访问。它';它可能是一个CGI程序,但也可能被隐藏在更大的东西里。这都是关于C++风格的,但是你也可以在这里看到其他语言的片段。
string*UserIP()--太好了。它';它是一个指向字符串的指针,这意味着它被分配到了其中的某个地方,我们不得不担心缓冲区的生存期。猜猜看';它是从头创建的,然后我们必须释放(删除)它?但是等等,如果分配失败怎么办?我猜它可能会返回NULL或NULL ptr之类的。此外,如果它能';找不到IP地址?我猜它也可以返回NULL/nullptr/任何值。我当然希望每个使用这个的人都能检查一下。。。
string UserIP()--这里没有更多关于一生的担忧,但是,哦,好吧,如果我们不';我不知道它是什么,需要提供一个错误?如果是';这是一种CGI情况,可能是远程地址或其他不存在的地址';因为某种原因,我没有定义。然后呢?我们扔吗?讨厌!我们会返回一些魔法值吗?真恶心!唐';不要说返回字符串";未知";,既然有';网络上有一个主机叫它,你最终以某种方式把它作为一个真正的价值?你只知道有人会这么做。问问有";空";作为他的车牌。
string UserIP(string*errmsg)——哦,天哪,我';我要生病了。当然,现在他们可以";设置错误消息";,但是现在你怎么知道什么时候应该看errmsg和返回值呢?
bool GetUserIP(string*ip)——这个更好一点,对吧?它';这有点不稳定,因为现在你';如果你和外行争吵,用户可能会做一些愚蠢的事情,比如给你一个糟糕的指针,而且这意味着他们必须从地址和指针的角度来思考;这可能也不太好。但是,嘿,至少你可以指出有些事情失败了。可惜你能';不要说什么。
bool GetUserIP(string*ip,string*errmsg)——好的,现在如果我们想对发生的事情提供一些彩色评论,我们可以包含一条消息,但是天啊,现在它';有两个外号。想象一下,呼叫站点将是什么样子。
结果<;字符串>;UserIP()--现在这变得很有趣。你可以做一些有趣的事情,比如有一个只在结果正确性检查后设置的标志。只有那时才是。允许使用value()。如果你打电话。首先,你会死。这应该会在开发的更早阶段吸引你,因为即使是";快乐之路";如果它';It’没有被正确使用。你也有一个。error()在另一种情况下返回一些好消息。它';It’对整体来说很遗憾<>;尽管如此。有点难看。。。一次又一次地打字很烦人。
ResultString UserIP()--与之前的想法相同,括号更少,但天哪,有人把它编码为一次性的吗?现在,当我们想对其他类型进行此操作时,会发生什么?我们是否复制并粘贴魔法";在调用value()";沉迷于ResultInt、ResultFloat、ResultDouble等等?如果一个bug修复只涉及一个问题,我们如何防止它们发生分歧?唐';我们真的需要做泛型编程和模板的能力吗?
字符串UserIP()--等等,没有';我们不是已经这么做了吗?不完全是。这一次,我们';我们的语言略有不同,假设也有所不同。本地人";字符串";类型现在包括ResultString(又名Result<;string>;)的所有正确性检查,所以现在你必须检查所有这些。现在这里看起来很简单,但你必须到处检查。处处只有这样你才能使用。从中获取值()。在它';我永远不会成为";失踪"人;而且总是有一些有用的价值?事实上,我们多久会有一个病例而不是另一个?我们的琴弦中有多少是";是的,永远都会是";与";可能完全失败了";?
它';这很复杂,对吧?要在一个地方赢一点,你必须在另一个地方多花一点钱。