【发布时间】:2019-05-18 09:30:31
【问题描述】:
我经常看到classes 喜欢
public class Person
{
string FirstName { get; set; }
string MiddleName { get; set; }
string LastName { get; set; }
int Age { get; set; }
}
其中一个属性,例如本例中的MiddleName(因为有些人在出生时没有中间名),允许为null。在我看来这是错误的,因为该类的任何消费者都必须知道该属性“可能”为空并执行类似的检查
public void PrintName(Person p)
{
Console.WriteLine(p.FirstName);
if (p.MiddleName != null)
{
Console.WriteLine(p.MiddleName);
}
Console.WriteLine(p.LastName);
}
我的处理方法是使用类似的组合
public interface IPerson
{
string FirstName { get; }
string LastName { get; }
int Age { get; }
}
public interface IMiddleNamed
{
string MiddleName { get; }
}
和
public void PrintName(IPerson p)
{
Console.WriteLine(p.FirstName);
if (p is IMiddleNamed)
{
Console.WriteLine((p as IMiddleNamed).MiddleName);
}
Console.WriteLine(p.LastName);
}
即使我的模型表示数据合约(例如,通过服务间通信序列化/反序列化的“价值袋”)也是如此。
以同样的方式,我避免使用具有 null-able 值类型的类,例如
public class Something
{
public int SomeInt { get; set; }
public double? SomeDouble { get; }
}
出于同样的原因。
但是我想知道这是否像“OOP 过度工程”,因为它显然会增加大量开发时间。
【问题讨论】:
-
欢迎来到可空引用类型的 c#8 提案:blogs.msdn.microsoft.com/dotnet/2017/11/15/…
-
C# 语言的下一个版本将包含(相当容易混淆)称为 “可空引用类型” 的东西,这将简化对允许
null的位置的规范并使 null 处理更加明确(其中很多是由编译器完成的)。在那之前,它可能是过度设计的 -
编码风格问题通常是题外话,因为对于 SO 来说过于宽泛/基于意见。您可能想检查是否可以使您的问题适合Software Engineering(我也希望有很多关于可空值、空对象等的现有问题 - 请务必先在那里搜索)。
-
你把事情复杂化了。把事情简单化。我会说你甚至不需要 MiddleName 属性。用户可以将他们的中间名和他们的名字放在一起。
标签: c# oop inheritance design-patterns