Tag: 固体原则

使用“单一责任原则”迫使我的容器拥有公共制定者

我正在努力按照SOLID原则进行设计。 我发现当你使用“单一责任原则”(SOLID的S)时,你通常必须在数据容器和数据处理器之间拆分类。 例如,如果我有一个具有5个属性的类人员从DB读取而不是将所有内容放在一个类中,我创建一个带有属性的Person类和另一个从数据库中读取该信息并创建Person的PersonReader类。 如果我这样做,我必须打开Person属性,以便PersonReader可以访问它们,但是我的封装比将所有内容放在黑盒子中并使属性只能读取更少。 我错过了什么或这是这个原则的缺点吗? 提前致谢 编辑:我已经将人作家改为一个人读者,因为没有必要在开始时公开财产制定者。

用于创建简单且高效的值类型的模式

动机: 在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾: 底线是自动属性很少适用。 实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用。 他给int Temperature作为一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏。 所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习。 基本要求: 不可能有无效的价值 封装转换操作 有效的应对(相当于替换它的int) 尽可能直观地使用(尝试int的语义) 执行: [System.Diagnostics.DebuggerDisplay(“{m_value}”)] public struct Celsius // : IComparable, IFormattable, etc… { private int m_value; public static readonly Celsius MinValue = new Celsius() { m_value = -273 }; // absolute zero public static readonly Celsius MaxValue = new Celsius() { m_value […]

DDD访问外部信息的方法

我有一个现有的银行应用程序类,如下所示。 银行账户可以是SavingsBankAccount或FixedBankAccount。 有一个名为IssueLumpSumInterest的操作。 对于FixedBankAccount,仅当帐户所有者没有其他帐户时才需要更新余额。 这要求FixedBankAccount对象了解帐户所有者的其他帐户。 如何通过遵循SOLID / DDD / GRASP /信息专家模式来做到这一点? namespace ApplicationServiceForBank { public class BankAccountService { RepositoryLayer.IRepository accountRepository; ApplicationServiceForBank.IBankAccountFactory bankFactory; public BankAccountService(RepositoryLayer.IRepository repo, IBankAccountFactory bankFact) { accountRepository = repo; bankFactory = bankFact; } public void IssueLumpSumInterest(int acccountID) { RepositoryLayer.BankAccount oneOfRepositroyAccounts = accountRepository.FindByID(p => p.BankAccountID == acccountID); int ownerID = (int) oneOfRepositroyAccounts.AccountOwnerID; IEnumerable accountsForUser […]