DRY(不要重复自己)和 if 作业

2024-04-07

我想我忘记了一些明显的事情,但如果它验证了尽可能保持干燥的条件,我似乎找不到一种分配值的方法...... 一些代码来解释我的意思......

a = (b > 1) ? b : c;

or even a = (a > 1) ? a : b;

所以当然这里没什么大不了的,但是如果 a 要被方法调用替换(可能是一个产量返回)或其他什么,那么我就必须调用它两次......

我唯一看到的是将它存储在一个变量中,然后就像上面的代码一样......

还有更好的主意吗?

编辑以便更好地理解: 假设我正在 xml 文件中搜索一个值,并使用 null 检查 (?. ?[]) 等,例如

string store_no = myXmlNode.SelectSingleNode("aChildNode")?.SelectSingleNode("myNode")?.Attributes?["store_no]?.Value;

所以在这里我将其存储在一个变量中,以便稍后测试它的值。 如果我想检查特定的 store_no !我必须做类似的事情

store_no = (store_no=="STORE23")? store_no : "unknown";

...是的,不确定这个例子是否足够明确,但想法就在这里;我可能不想将数据存储在变量中(例如大数据块)有没有办法获得相同的结果?


我想我忘记了一些明显的事情,但如果它验证了尽可能保持干燥的条件,我似乎找不到一种分配值的方法

首先让我们消除您的一个常见误解。

这是对 DRY 含义的完全误解。如果你有一个Customer对象并且你有一个Address对象和Customer有字段BillingCity and BillingPostalCode and 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() if 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 and ID成为具有特定含义但仅在范围内的只读变量in:

N(P() ?? (let m = M() in m > 0 ? m : 0));

请注意,C#does支持let表达但是仅在查询理解中。如果它能在语言中更普遍地支持它,那就太好了。

多年来,已经有许多建议添加let多年来,表达式或其更通用的形式(排序表达式)被引入到 C# 中。有关示例,请参阅 github roslyn 问题跟踪器。也许这会进入 C# 8;如果你想要的话,就去参加论坛吧。

那么与此同时你能做什么呢?

原来在那里areC# 中的 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()一次,但是超级奖金,它更容易阅读,因为现在程序文本表示对其执行的操作,而不是程序文本是一系列难以阅读的标点符号。

一些流畅风格的扩展方法可以让你的代码更容易阅读。养成使用它们的习惯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DRY(不要重复自己)和 if 作业 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐