- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是关于类型转换中的"is"和“作为”以及CA1800 PostSharp规则。我想知道我认为的解决方案是否是最好的解决方案,或者它是否存在我看不到的任何问题。
我有这段代码(名为 OriginaL Code 并减少到最低限度)。 ValidateSubscriptionLicenceProducts 函数尝试通过强制转换并稍后检查一些内容(在//Do Whatever 中)来验证 SubscriptionLicence(可能有 3 种类型:Standard、Credit 和 TimeLimited)。
PostSharp 提示 CA1800:DoNotCastUnnecessarily。原因是我将同一对象两次转换为同一类型。此代码在最好的情况下将转换 2 次(如果它是 StandardLicence),在最坏的情况下将转换 4 次(如果它是 TimeLimited Licence)。我知道有可能使规则无效(这是我的第一种方法),因为这里对性能没有太大影响,但我正在尝试一种最佳方法。
//Version Original Code
//Min 2 casts, max 4 casts
//PostSharp Complains about CA1800:DoNotCastUnnecessarily
private void ValidateSubscriptionLicenceProducts(SubscriptionLicence licence)
{
if (licence is StandardSubscriptionLicence)
{
// All products must have the same products purchased
List<StandardSubscriptionLicenceProduct> standardProducts = ((StandardSubscriptionLicence)licence).SubscribedProducts;
//Do whatever
}
else if (licence is CreditSubscriptionLicence)
{
// All products must have a valid Credit entitlement & Credit interval
List<CreditSubscriptionLicenceProduct> creditProducts = ((CreditSubscriptionLicence)licence).SubscribedProducts;
//Do whatever
}
else if (licence is TimeLimitedSubscriptionLicence)
{
// All products must have a valid Time entitlement
// All products must have a valid Credit entitlement & Credit interval
List<TimeLimitedSubscriptionLicenceProduct> creditProducts = ((TimeLimitedSubscriptionLicence)licence).SubscribedProducts;
//Do whatever
}
else
throw new InvalidSubscriptionLicenceException("Invalid Licence type");
//More code...
}
这是使用 "as" 的改进版本。不要提示 CA1800 但问题是它总是会投 3 次(如果将来我们有 30 或 40 种类型的许可证,它可能会表现不好)
//Version Improve 1
//Minimum 3 casts, maximum 3 casts
private void ValidateSubscriptionLicenceProducts(SubscriptionLicence licence)
{
StandardSubscriptionLicence standardLicence = Slicence as StandardSubscriptionLicence;
CreditSubscriptionLicence creditLicence = Clicence as CreditSubscriptionLicence;
TimeLimitedSubscriptionLicence timeLicence = Tlicence as TimeLimitedSubscriptionLicence;
if (Slicence == null)
{
// All products must have the same products purchased
List<StandardSubscriptionLicenceProduct> standardProducts = Slicence.SubscribedProducts;
//Do whatever
}
else if (Clicence == null)
{
// All products must have a valid Credit entitlement & Credit interval
List<CreditSubscriptionLicenceProduct> creditProducts = Clicence.SubscribedProducts;
//Do whatever
}
else if (Tlicence == null)
{
// All products must have a valid Time entitlement
// All products must have a valid Credit entitlement & Credit interval
List<TimeLimitedSubscriptionLicenceProduct> creditProducts = Tlicence.SubscribedProducts;
//Do whatever
}
else
throw new InvalidSubscriptionLicenceException("Invalid Licence type");
//More code...
}
但后来我想到了一个最好的。这是我使用的最终版本。
//Version Improve 2
// Min 1 cast, Max 3 Casts
// Do not complain about CA1800:DoNotCastUnnecessarily
private void ValidateSubscriptionLicenceProducts(SubscriptionLicence licence)
{
StandardSubscriptionLicence standardLicence = null;
CreditSubscriptionLicence creditLicence = null;
TimeLimitedSubscriptionLicence timeLicence = null;
if (StandardSubscriptionLicence.TryParse(licence, out standardLicence))
{
// All products must have the same products purchased
List<StandardSubscriptionLicenceProduct> standardProducts = standardLicence.SubscribedProducts;
//Do whatever
}
else if (CreditSubscriptionLicence.TryParse(licence, out creditLicence))
{
// All products must have a valid Credit entitlement & Credit interval
List<CreditSubscriptionLicenceProduct> creditProducts = creditLicence.SubscribedProducts;
//Do whatever
}
else if (TimeLimitedSubscriptionLicence.TryParse(licence, out timeLicence))
{
// All products must have a valid Time entitlement
List<TimeLimitedSubscriptionLicenceProduct> timeProducts = timeLicence.SubscribedProducts;
//Do whatever
}
else
throw new InvalidSubscriptionLicenceException("Invalid Licence type");
//More code...
}
//Example of TryParse in CreditSubscriptionLicence
public static bool TryParse(SubscriptionLicence baseLicence, out CreditSubscriptionLicence creditLicence)
{
creditLicence = baseLicence as CreditSubscriptionLicence;
if (creditLicence != null)
return true;
else
return false;
}
它需要更改 StandardSubscriptionLicence、CreditSubscriptionLicence 和 TimeLimitedSubscriptionLicence 类以具有“tryparse”方法(复制在代码下方)。这个版本我认为它最少只投一次,最多投三个。 你觉得 improve 2 怎么样?有没有最好的方法?
最佳答案
在您的三个代码片段中,“改进 2”似乎是最好的一个。不过,我认为您可以通过一种完全消除类型转换需求的方式来改进您的设计。
将名为 ValidateProducts
的抽象方法添加到 SubscriptionLicence
并让每个子许可证实现特定于该特定类型许可证的逻辑。这样,您将业务逻辑与数据放在一起,从而避免 anemic domain model .
这样,您的方法的实现将只是:
private void ValidateSubscriptionLicenceProducts(SubscriptionLicence licence)
{
if(!licence.ValidateProducts())
throw new Exception("Failed to validate products");
}
此外,通过在基类上抽象方法,您强制执行每个“子许可证”来实现该方法,因此您无需检查任何内容。因此,即使将来添加了新类型的许可证,也永远不必更改 ValidateSubscriptionLicenceProducts
方法。
希望它有意义。
关于c# - 这个对 "PostSharp complains about CA1800:DoNotCastUnnecessarily"的修复是最好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598982/
class ClassA { class ClassB { } } let compiles: [ClassA.ClassB] let doesNotCompile = [ClassA
同时使用 facebook debugger ,它提示: Warning fb:app_id hasn't been included in the meta tags. Specify the ap
我仍在尝试掌握 Flow 的工作原理,任何人都可以解释为什么这个简单的示例会引发错误? function say(text: string) { console.log(text); } say(
在下面的代码中: public class FooMain { private static void foo(byte b) {} public static void main(S
出于测试目的,我经常开始在现有项目中键入一些代码。因此,我要测试的代码先于所有其他代码,如下所示: public static void main(String[] args) { char
我知道有一百万个关于单例的问题和答案,但我似乎无法找到解决方案。所以冒着反对票的风险,这是我的问题: 我想使用 Andrei Alexandrescu 的现代 C++ 设计中的单例实现: 标题: cl
我是Flutter的初学者。我想创建将数据显示为list,piechart和barchart的TabBarView。当我开始编码时,一切都很好。为了查看它是否正常工作,我在选项卡上附加了不同的颜色。首
这个问题是关于类型转换中的"is"和“作为”以及CA1800 PostSharp规则。我想知道我认为的解决方案是否是最好的解决方案,或者它是否存在我看不到的任何问题。 我有这段代码(名为 Origin
我是 Java 实体的新手,我从 Query.getSingleResult() 调用中遇到了一些奇怪的问题。这是一个代码片段: LoaPoliciesConfig policy = new Lo
SO 上已经有很多关于 unique_ptr 和不完整类型的问题,但没有一个能给我一个概念来理解为什么以下内容不起作用: // error: ... std::pair::second has inc
我有这个代码: struct A{}; template struct B { void foo() {} }; B b; //Error: missing template argument
这个问题在这里已经有了答案: Understanding checked vs unchecked exceptions in Java (21 个答案) 关闭 4 年前。 我有以下代码: publ
我正在使用 OneSignal 来管理我的推送通知。对于某些通知,我收到: Notifications must have English language content 但我只用英语发送所有内容.
我正在尝试执行一个使用 XML::Simple 的简单 Perl 程序从 XML 文件中打印出数据。但是,我得到的错误是: no element found at line 15, column 0,
我正在阅读官方文档:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我正在阅读官方文件:https://react.dev/learn/keeping-components-pure#detecting-impure-calculations-with-strict-
我有这个死简单.travis.yml对于一个java项目。当我对文件运行“travis-lint”时提示 [17:24:23@emeraldjava]$ travis-lint /Users/paul
下面是我的二头肌代码,用于创建和分配策略来检测没有诊断设置的 key 保管库。该策略具有 deployIfNotExists 设置。因此它也应该能够创建缺失的诊断设置。 (来自具有修复过程的门户) t
我有以下脚本,它通过 ssh 连接到远程服务器并在其 Postgresql 数据库上发出 SQL 语句: #!/bin/bash db_query() { app_server="$1"
我一直在研究 Swift 协议(protocol),我想弄清楚为什么这段代码不起作用... protocol Animal { var name: String {get} var breed
我是一名优秀的程序员,十分优秀!