- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想我忘记了一些明显的东西,但我似乎无法找到一种方法来分配一个值,如果它验证一个条件保持尽可能干燥......一些代码来解释我的意思......
a = (b > 1) ? b : c;
甚至 a = (a > 1) ? a : b;
所以当然这没什么大不了的,但如果 a 被方法调用替换(可能是 yield return 那里)或其他什么,我将不得不调用它两次......
我唯一看到的是将它存放在一个变量中,然后就像上面的代码一样...
有更好的主意吗?
编辑以便更好地理解:假设我正在 xml 文件中搜索一个值,使用空检查 (?. ?[]) 等,例如
string store_no = myXmlNode.SelectSingleNode("aChildNode")?.SelectSingleNode("myNode")?.Attributes?["store_no]?.Value;
所以在这里我将其存储在一个变量中,以便稍后测试它的值。如果我想检查一个特定的 store_no !我必须做类似的事情
store_no = (store_no=="STORE23")? store_no : "unknown";
...是的,不确定这个例子是否足够明确,但想法就在这里;我可能不想将数据存储在变量中(例如,巨大的数据 block )有没有办法获得相同的结果?
最佳答案
I think I'm forgetting something evident but I can't seem to find a way to assign a value if it validates a condition remaining as DRY as possible
让我们首先消除您对一个常见误解的误解。
这完全是对 DRY 含义的错误陈述。如果您有 Customer
对象,你有一个 Address
对象和 Customer
有字段 BillingCity
和 BillingPostalCode
和 HomeCity
依此类推,那么您的代码就不是 DRY,因为相同的信息在两个地方被冗余表示。您应该重新设计代码,以便 Customer
收藏了 Address
对象。
现在,避免在整个节目中剪切和粘贴重复代码确实是个好主意,但 DRY 是关于中型到大型 代码的设计。 DRY 绝对不意味着您的代码不应该在同一个表达式中两次使用同一个变量!
既然我们已经解决了这个问题,让我们看看您对语言的评论。
我们经常处于“表达式上下文”中的情况——也就是说,一个长的、可能是流利风格的表达式,我们希望避免做多余的工作。例如,我们可能有:
x = M() > 0 ? M() : 0;
也许调用 M()
两次很昂贵,或者它不是幂等的。任何。没关系。重点是,我们不想调用它两次。
令人恼火的是,我们必须退出表达式上下文并进入语句上下文:
var m = M();
x = m > 0 ? m : 0;
这当然是合法的,但是有点烦人。此外,在某些情况下它可能会很棘手:
N(P() ?? (M() > 0 ? M() : 0));
现在我们该怎么办?假设我们只想调用 M()
,没有明显的方法可以在不手写的情况下保留语义。如果P()
为空。
var t = default(T);
var p = P();
if (p == null) {
var m = M();
t = m > 0 ? m : 0;
} else {
t = p.Value;
}
N(t);
恶心。天哪,这太可怕了。
其他语言通过引入 let
解决了这个问题表达式。我们真正想要的是能够在表达式中间引入一个新的局部变量。常见的语法是 let ID = EXPRESSION in EXPRESSION
和 ID
成为具有特定含义但仅在 in
范围内的只读变量:
N(P() ?? (let m = M() in m > 0 ? m : 0));
请注意,C# 确实 支持 let
表达式,但仅在查询理解中。如果它在语言中更普遍地支持它,那就太好了。
多年来有很多建议添加let
这些年来,表达式,或者它们更一般的形式,排序表达式,进入 C#。有关示例,请参阅 github roslyn 问题跟踪器。也许这会进入 C# 8;如果需要,请参加论坛。
那么在此期间您可以做什么?
事实证明,C# 中是 let 表达式。 let x = y in z
是一种很好的写法 (((Func<X, Z>)(x=>z))(y))
.所以你可以这样写:
N(P() ?? (((Func<int, int>)(m => m > 0 ? m : 0))(M())));
但这看起来几乎一样可怕。那是一个不可读的困惑。
问题是 lambda。这样会更好:
Func<int, int> f = m => m > 0 ? m : 0;
...
N(P() ?? f(M()));
但这有点不透明。我们如何进一步改进这一点?
我们可以使它成为一个本地函数,但更好的是,我们可以使它成为一个扩展方法并进行流畅的编程:
public static int NotNegative(this int x) => x > 0 ? x : 0;
...
N( P() ?? M().NotNegative());
完成。这只评估 M()
一次,但是 super 奖励,它更容易阅读,因为现在程序文本代表正在对其执行的操作,而不是程序文本是一系列难以阅读的标点符号。
小的流利式扩展方法可以使您的代码更易于阅读。养成使用它们的习惯。
关于c# - DRY (Don't Repeat Yourself) 和作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529952/
我是 DRY principle 的坚定拥护者: Every piece of knowledge must have a single, unambiguous, authoritative rep
假设我有一个稍微复杂的 for 循环,用于不同的情况。有没有一种方法可以提取该 forloop 并仍然保持代码可读性? 例如: private function bar(){ for(i=0;
JSData 是替代还是补充 Sequelize.js? 我试图了解这两个库如何一起玩以及是否应该一起玩。 从我的阅读来看,JSData 主要处理访问数据,而 Sequelize.js 将创建和修改
我有 aws-eks 集群,下面是我替换现有配置的命令。 kubectl create configmap flink-config --from-file=./config -o yaml --dr
我正在设计一个可重用的类库,其中包含 2 个名为 core.xml.dll 和 core.string.dll 的程序集(其中包括)。 xml 程序集引用字符串程序集,以便使用一些字符串辅助方法。 但
我正在尝试找到一种更 DRY 的方式来使用 docker-compose env。 docker-compose-base.yml base: image: reactjs_web v
我有一些看起来像这样的类(class): struct A { void *stuff; int x; int foo() const; } 我有一些采用这种类型参数的函数,例如 int
我目前正在 Silverlight 中构建一些自定义控件。我希望这些控件能够响应验证错误。我想要做的是在我的控件周围设置红色边框,就像默认的 Silverlight 控件一样。 我的理解是我需要将它添
我正在处理一些服务器端代码,在将它们传递给客户端之前包装所有异常,因此所有面向客户端的方法都有以下代码 try{ DoSomething(); } catch (ExceptionA e) {
“纵深防御”原则指出,应该在多个地方实现约束,这样如果一条数据绕过或漏过一层,就会在下一层被捕获。一个很好的例子是在网络应用程序中——你将验证放在客户端 javascript 中,放在服务器端代码中(
使用这种方法在 MVC 中查看模型:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view
我想将 jquery 脚本优化为多个元素(单个页面上有许多幻灯片)。我可以添加一些功能,但这并不干燥(不要重复自己)。 Pr
我有一些代码(不是我的),其中包含带有声明的范围映射的指令。我的愿望是在其他地方使用该指令并传递将在模板中使用的附加变量。 我要传递的变量是theVar。 我发现唯一可行的解决方案看起来很噩梦:
我将数据存储在数组中,并从该数组中使用循环创建表。对于一个表,我需要两列,另外 30 列(取决于数组项)。这将有三列。 var prodej = [ /*First column, second,
有没有更好的方法来声明来自同一组(例如“com.android.support”)具有相同版本(例如“23.4.0”)的多个软件包(例如“appcompat-v7”)? 实际申报: ... def a
我有一个看起来像这样的对象: var myObj = { _fooCon: function(f) { if (typeof f != 'function') throw
这就是我所拥有的。 Map data = new HashMap<>(); // assume this has been populated public int getLastestVersion
我在尝试维护 DRY 概念时遇到了 AngularJS 的问题 [不要重复自己]。我希望我做错了什么,有人可以指出我的错误。 一家公司销售卡车和汽车。 这两个项目具有相似和不同的属性。添加到其中一种的
我最终在几个类中得到了几个遵循相同模式的方法(每个类中总是有一堆这些方法): private void updateFoo() { String newFoo = fooTextField.g
假设我有一个字典config,其中包含键username和password。我想创建一个新字典,仅包含 config 中的username 和 password 键值对。一种方法是: new_dict
我是一名优秀的程序员,十分优秀!