问题标签 [magic-string]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1928 浏览

asp.net-mvc - 带有 lambda 表达式的 ASP.net MVC 操作 URL

我确定我已经看过这种语法

或类似的东西作为在 ASP.net MVC 中生成操作 URL 的一种方式,而无需使用魔法字符串。但是,我找不到那个动作重载。我有 ASP.NET MVC 1.0。它在哪里?

0 投票
2 回答
348 浏览

c# - 解耦没有魔术字符串的屏幕

我的 WPF 项目将像这样组织:

为了显示Screen1Screen2我将使用这样的东西:ScreenManager.Show("Group1.Screen1")这在名称空间中查找(使用反射)Screens.Group1.Screen1一个 View 和一个 ViewModel 并实例化它们。

如何在不耦合的情况下消除魔术字符串Screen1Screen2(我不希望其中的类Screen2使用Screen1命名空间)。我也想要某种屏幕发现(自动完成/智能感知)

或者也许某种方式(自动测试)来验证所有调用ScreenManager.Show是否有效。

更新: 我想出了这个:

用法:

不理想,但我认为违反 DRY 仍然比魔术字符串好。而且我可以自动测试(通过反射)所有调用都是有效的。

0 投票
3 回答
226 浏览

c# - 识别领域的“优雅”方式?

我正在编写一个系统,它是程序员应用程序的基础,需要检测他们对某些数据的访问。我主要可以使用属性来做到这一点,如下所示:

然后我进入并调整getset访问器,以便它们适当地处理访问。然而,这要求用户(应用程序程序员)将他们的所有数据定义为属性。

如果用户想要使用具有“普通”字段(而不是属性)的预先存在的类,我无法检测到这些访问。例子:

我无法检测到对y. 但是,我想允许使用预先存在的类。作为妥协,用户有责任在访问此类数据时通知我。例如:

类似的东西。相信我,我已经对此进行了非常彻底的研究,甚至直接分析字节码以检测访问由于可能存在间接等原因是不可靠的。我确实需要用户通知我。

现在我的问题是:你能推荐一种“优雅”的方式来执行这些通知吗?(是的,我知道这整个情况一开始并不“优雅”;我试图不让它变得更糟;))。你会怎么做?

这对我来说是个问题,因为实际上情况是这样的:我有以下课程:

如果用户想要这样做:

他们必须改为这样做:

WhereWrite将返回 的克隆notSoNice,这就是我希望set访问器做的事情。但是,使用字符串非常难看:如果稍后他们重构该字段,他们将不得不检查他们的Write("notSoNice")访问并更改字符串。

我们如何识别字段?我只能想到字符串、整数和枚举(也就是整数)。但:

  • 我们已经讨论过字符串的问题。
  • 整数很痛苦。它们甚至更糟,因为用户需要记住哪个 int 对应于哪个字段。重构同样困难。
  • 枚举(例如NOT_SO_NICEZ,即 的字段SemiNiceClass)易于重构,但它们要求用户为每个类(SemiNiceClass等)编写一个枚举,并为类的每个字段提供一个值。它很烦人。我不想让他们恨我;)

那么,我听到你问,为什么我们不能这样做(下)?

因为我需要知道正在访问哪个字段semiNice.notSoNice,并且不识别字段。这是字段的值,而不是字段本身。

叹。我知道这很丑陋。相信我 ;)

我将非常感谢您的建议。

提前致谢!

(另外,我无法为这个问题想出好的标签。如果您有更好的想法,请告诉我,我会编辑它们)


编辑#1: Hightechrider 的建议:表达式。

我不知道是否Write(x =>semiNice.y, 0)是基于我为我的问题(SemiNiceClass等)编写的类,还是只是一个示例,但如果是前者,它与结构不匹配:y. SemiNiceClass你的意思是Write(x =>semiNice.notSoNice.y, 0)

我不确定您对我使用它的意思...我将发布我编写的代码:

我如何获得该信息Write?我找不到任何方法从Func<,>. 另外,为什么写semiNice.Write(x => semiNice.notSoNice.y, 50);而不是semiNice.Write(() => semiNice.notSoNice.y, 50);,因为我们没有使用x任何东西?

谢谢。


编辑#2: Hans Passant 的建议:用属性替换字段。

这是我最初打算做的,但重新编译不是一种选择。


编辑#3:Ben Hoffstein 的建议:动态代理;林福。

我已经对此进行了漫长而艰难的研究,并且由于相对复杂的原因我无法使用它。解释太长了,但请放心:如果我可以使用它,我会的。它比我目前的解决方案要整洁得多。

0 投票
6 回答
7817 浏览

.net - .Net - 避免魔法字符串的策略

在工作代码中,我们有很多魔术字符串的用法,如下面的代码片段:

所以有很多地方我们通过一个字符串作为参数来查看用户是否有特定的权限。我不喜欢这样,因为这会产生很多魔术字符串。

有什么更好的方法呢?

枚举、常量、类?

0 投票
2 回答
2614 浏览

c# - 使用 lambda 表达式来避免使用“魔术字符串”来指定属性

我正在编写一个服务来获取特定类型的对象的集合,并将其原始、字符串和 DateTime 类型输出为CSV 格式的字符串。我有以下两个陈述。我发现基于 lambda 的版本要干净得多。

魔弦版

与 Lambda 版本

根据 Jon Skeet 的建议,所有 lambda 方法共享一个相似的方法签名

然后我通过expression.Bodyto FindMemberExpression。我已经从nhlambdaextensions 项目FindMemberExpression的 ExpressionProcessor.cs 方法中改编了代码。我非常相似的版本如下:FindMemberExpression

我正在测试足够的案例FindMemberExpression?考虑到我的用例,我正在做的事情是否矫枉过正?

0 投票
2 回答
1485 浏览

c# - 从 QueryOver(或者 Fluent NHibernate)中获取魔法字符串?

使用 FluentNHibernate、新的 QueryOver API 和新的 Linq 提供程序的众多原因之一都是因为它们消除了“魔术字符串”或表示属性的字符串或其他可以在编译时表示的东西。

遗憾的是,我正在使用尚未升级为支持 QueryOver 或 LINQ 的 NHibernate 的空间扩展。结果,我不得不使用 QueryOver Lambda 表达式和字符串的组合来表示我想要查询的属性等。

我想做的是——我想要一种方法来询问 Fluent NHibernate(或者可能是 NHibernate QueryOver API)魔术字符串“应该是”什么。这是一个伪代码示例:

目前,我会写——

我想写的是——

有这样的东西吗?会不会很难写?

编辑:我只是想指出,这不仅仅适用于空间——实际上任何尚未转换为 QueryOver 或 LINQ 的东西都可能受益。

0 投票
1 回答
389 浏览

asp.net-mvc - 如何从自定义模型绑定器中删除魔术字符串?

我现在已经编写了几个自定义模型绑定器,并且意识到我已经陷入了依赖魔术字符串的陷阱,例如:

我希望能够使用表达式来强输入前缀名称,但无法弄清楚如何,并且会感谢您的帮助。

谢谢。

0 投票
1 回答
488 浏览

.net-4.0 - 实体框架的 Include() 是否有一种内置方法可以避免使用魔术字符串?

可能重复:
Entity Framework Include() 强类型

好的,我有一个实体框架查询,我使用 Include 告诉它我想要加载一个相关的对象:

var employees = _entities.Employees.Include("Manager").ToList()

通过使用包含,我避免为每个员工的经理记录生成查询(取而代之的是在查询中使用友好的 JOIN,并且数据库再也不会受到打扰)。

但是魔术字符串“Manager”的使用令人不安,尤其是在来自据称更原始、快速和肮脏的 Linq2SQL 之后。从编码的角度来看,它就像一把上膛的枪,准备抛出一个应该在编译时捕获的运行时异常。它还极大地阻碍了重构。

是否有任何内置的属性或方法来解决这个问题?例如,我将Manager.EntityKeyPropertyName其视为静态字符串属性,但这似乎不是我想要的。我宁愿不在某处手动添加硬编码的常量列表,但它会比裸智能盲魔术字符串更好。

0 投票
3 回答
1155 浏览

flash - ActionScript 3 对象的属性名称为字符串?

我想消除这些魔术字符串的使用:

或者

键入以下内容会很甜蜜:

它将允许轻松重构,并在属性名称更改时消除运行时错误。

有任何想法吗?

0 投票
2 回答
208 浏览

magic-numbers - 如何处理“简单”的魔法值?

我认为这是相当独立于语言的,但如果我错了,那就选择 C#(或 C 或 C++)。

对于“简单”的魔法值,我的意思是这样的:

或者

或者

在写这个(上面的伪代码)时,我有点震惊,它真的只适用于与 0 比较的东西。

无论如何,处理这些魔法值的最佳方法是什么(考虑可读性、要创建的击键/代码数量和名称)?

拥有一个专门用于此的整个(静态)类(或 C# 中的枚举)感觉像是极端的矫枉过正。