我最近花了很多时间阅读SOLID原则并决定了解我使用的代码库是如何比较的.
在我们的一些代码中有一个存储库(存储库A).当要从存储库A中删除记录时,我们还需要从存储库B中删除关联的记录.因此,原始编码器创建了对存储库B的具体实现的依赖性.存储库A中的方法在事务中并且从存储库A中删除记录,然后调用存储库B上的方法以删除关联的数据.
我对S原理的理解是每个对象应该只有一个改变的理由,但是对于我的存储库A有2个理由要改变?还是我离开了标记?
界面隔离原则只是单一责任原则的替代吗?
我认为,如果我的类满足SRP,则无需提取多个接口.
所以ISP看起来像解决方案,以防我们因某些原因打破SRP.
我对吗 ?
design-patterns single-responsibility-principle solid-principles interface-segregation-principle
我知道OOP(面向对象编程)和SOLID.
和
但是,我不确定具体的区别是什么,以及SOLID是否是OOP的子集.谁能帮助解释这些差异?
我正在研究SOLID原则,并且有关于接口的依赖关系管理的问题.
我正在阅读的书中的一个例子(Gary McLean Hall的C#自适应代码)显示了一个TradeProcessor类,它将获取交易数据,处理它并将其存储在数据库中.交易数据由一个名为的类建模TradeRecord.甲TradeParser类将处理转换所接收到的交易数据TradeRecord例如(一个或多个).本TradeProcessor类只引用了ITradeParser这样它不依赖于接口TradeParser的实现.
作者使用该Parse方法(在ITradeParser界面中)返回一个IEnumerable<TradeRecord>包含已处理交易数据的集合.这ITradeParser是不是意味着现在依赖于TradeRecord班级?
作者不应该做一些像创建ITradeRecord接口并Parse返回ITradeRecord实例集合的东西吗?还是我错过了重要的事情?
这是代码(执行TradeRecord是无关紧要的,因此省略):
TradeProcessor.cs
public class TradeProcessor
{
private readonly ITradeParser tradeParser;
public TradeProcessor(ITradeParser tradeParser)
{
this.tradeParser = tradeParser;
}
public void ProcessTrades()
{
IEnumerable<string> tradeData = "Simulated trade data..."
var trades = tradeParser.Parse(tradeData);
// Do something with the parsed data...
} …Run Code Online (Sandbox Code Playgroud) 在一些个人项目中,我正在慢慢地从PHP5转向Python,我现在很喜欢这种体验.在选择沿着Python路线前,我看了Ruby.我从红宝石社区注意到的是,猴子修补既常见又备受推崇.我也遇到了很多关于调试ruby s/w的试验的恐怖故事,因为有人包括一个相对无害的库来完成一些工作但是修补了一些使用频繁的核心对象而没有告诉任何人.
我选择Python(除了其他原因)之外它的语法更清晰,而且它可以完成Ruby所能做的一切.Python正在使得OO点击比PHP更好,我正在越来越多地阅读OO原则以增强这种更好的理解.
今晚我一直在阅读Robert Martin的SOLID原则:
我目前正在接受O:软件实体(课程,模块,功能等)应该开放扩展,但是为了修改而关闭.
我的头脑是在确保OO设计的一致性和整个猴子修补之间的冲突.我知道可以在Python中进行猴子修补.我也明白,"pythonic"是遵循常见的,经过良好测试的oop最佳实践和原则.
我想知道的是社区对两个对立主题的看法; 他们如何互操作,当它最好地使用一个在另一个上时,是否应该完成猴子修补......希望你能为我提供解决问题的方法.
接口隔离原则(ISP)表示许多客户端特定接口优于一个通用接口.为什么这很重要?
java oop design-principles solid-principles interface-segregation-principle
信息专家,Tell-Don't-Ask和SRP通常被一起提及为最佳实践.但我认为他们存在分歧.这就是我所说的.
有利于SRP但违反Tell-Don't-Ask&Info-Expert的代码:
Customer bob = ...;
// TransferObjectFactory has to use Customer's accessors to do its work,
// violates Tell Don't Ask
CustomerDTO dto = TransferObjectFactory.createFrom(bob);
Run Code Online (Sandbox Code Playgroud)
有利于Tell-Don't-Ask和Info-Expert但违反SRP的代码:
Customer bob = ...;
// Now Customer is doing more than just representing the domain concept of Customer,
// violates SRP
CustomerDTO dto = bob.toDTO();
Run Code Online (Sandbox Code Playgroud)
请告诉我这些做法如何能够和平共处.
术语的定义,
信息专家:具有操作所需数据的对象应承载该操作.
告诉不要问:不要向对象询问数据以便工作; 告诉对象做这项工作.
单一责任原则:每个对象应具有狭义的责任.
oop single-responsibility-principle tell-dont-ask solid-principles
动机:
在阅读Mark Seemann关于Code Smell:Automatic Property的博客时,他说接近结尾:
底线是自动属性很少适用.实际上,只有当属性的类型是值类型并且允许所有可想到的值时,它们才适用.
他给出int Temperature了一个难闻的气味的例子,并建议最好的修复是单位特定值类型,如摄氏.所以我决定尝试编写一个自定义的Celsius值类型,它封装了所有边界检查和类型转换逻辑,作为更加SOLID的练习.
基本要求:
执行:
[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 = int.MaxValue };
private Celsius(int temp)
{
if (temp < Celsius.MinValue)
throw new ArgumentOutOfRangeException("temp", "Value cannot be less then Celsius.MinValue (absolute …Run Code Online (Sandbox Code Playgroud) c# encapsulation design-patterns value-type solid-principles
在SRP中,"责任"通常被描述为"改变的理由",因此每个类(或对象?)应该只有一个人应该去那里并改变它的原因.
但是,如果你把它变成极端细粒度,你可以说一个对象将两个数字加在一起是一个责任,也是一个可能的改变原因.因此,对象不应包含其他逻辑,因为它会产生另一个改变的原因.
我很好奇是否有人有任何"范围"策略,单一责任原则稍微不那么客观?
每当我看到关于得墨忒耳法的文章时,作者似乎都没有给出如何遵守这一法律的可靠实例.他们都解释了它是什么,并展示违法的例子,但这很容易.
可能有很多方法可以遵守这个法律(良好的设计和规划是一个),但用非常简单的术语来说,这是一种服从它的方法吗?
假设我有一个具有以下属性的类:
public class Band {
private Singer singer;
private Drummer drummer;
private Guitarist guitarist;
}
Run Code Online (Sandbox Code Playgroud)
我在程序的某个地方,我有一个这个Band类的实例,我想要吉他手的名字,我通常看到的是:
guitaristName = band.getGuitarist().getName();
Run Code Online (Sandbox Code Playgroud)
那个看起来并不太糟糕,因为链条不会太深,但是得墨忒耳法则说可能应该这样做:
guitaristName = band.getGuitaristName();
Run Code Online (Sandbox Code Playgroud)
我的Band班级有一个方法:
public String getGuitaristName() {
return guitarist.getName();
}
Run Code Online (Sandbox Code Playgroud)
这是你应该如何遵守法律?
谢谢.
solid-principles ×10
oop ×5
c# ×3
single-responsibility-principle ×3
interface-segregation-principle ×2
java ×2
ruby ×1
value-type ×1