我可以通过封装,依赖注入,最少知识原则,你不需要它来掌握"做一件事"的部分; 但我怎么理解第二部分"做得好"?
给出的一个例子是完整性的概念,在同一篇YAGNI文章中给出:
例如,在允许添加项目,删除项目或修改项目的特征中,可以使用完整性来推荐"重命名项目".
但是,我发现这样的推理很容易被滥用到特征蠕变中,从而违反了"做一件事"的部分.
因此,看到相当一个特征属于"做得好"类别(因此,将其包含在函数/类/程序中)或其他"做一件事"类别(因此,排除它)的试金石是什么? ?
第一部分,"做一件事",最好通过UNIX的ls命令来理解,因为它包含了过多的标志来格式化它的输出,这些标志本应完全委托给另一个外部程序.但我没有一个很好的例子来看第二部分"做得好".
什么是一个很好的例子,删除任何进一步的功能将使它不"做得好"?
我目前正在尝试学习使用IoC容器的好处并熟悉DI.我已经开始使用StructureMap,因为它看似相当简单但功能强大.
我想验证我对这些概念的理解是否正确.让我们假设一个应用程序中的以下基本类(为简洁起见,省略了详细信息):
public class OrderService : IOrderService
{
private IOrderRepository _repository;
private ITaxCalculator _taxCalculator;
private IShippingCalculator _shippingCalculator;
public OrderService(IOrderRepository repository,
ITaxCalculator taxCalculator,
IShippingCalculator shippingCalculator)
{
this._repository = repository;
this._shippingCalculator = shippingCalculator;
this._taxCalculator = taxCalculator;
}
public IOrder Find(int id) { return this._repository.Find(id); }
}
public class OrderRepository : IOrderRepository
{
public IOrder Find(int id) { // ... }
}
public class StandardShippingCalculator : IShippingCalculator
{
// ...
}
public class StandardTaxCalculator : ITaxCalculator
{
private ITaxSpecification _specification;
public StandardTaxCalculator(ITaxSpecification specification) …Run Code Online (Sandbox Code Playgroud) .net dependency-injection inversion-of-control solid-principles
由于PHP是一种松散类型的语言,如何在PHP中应用DIP原则?
一个实际的例子将不胜感激.
我正在处理的一个应用程序处理工作项.根据工作项的状态,可以使用许多操作."完成""取消""重新分配"等...
为了提供动作的功能,我现在有一个看起来像这样的界面......
public interface IActionProvider{
public void Complete(WorkItem workItem);
public void Cancel (WorkItem workItem);
public void Reassign(WorkItem workItem);
}
Run Code Online (Sandbox Code Playgroud)
然后根据工作项的其他细节,我有接口的具体实现.仅举例......
public class NormalActionProvider :IActionProvider
{
...
}
Run Code Online (Sandbox Code Playgroud)
和
public class UrgentActionProvider : IActionProvider
{
....
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我想添加一个新动作,请说......"委托"我必须更新界面,当然这对所有实现都有影响.
这违反了开/关原则吗?你能推荐一个可以帮助我的设计模式或重构吗?
根据SOLID原则,类不能依赖于其他类,必须注入依赖项.这很简单:
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望我的Foo类能够创建Bar,而不知道IBar背后的确切实现呢?我可以在这里考虑4种解决方案,但所有这些解决方案似乎都有缺点:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
最后一种情况看起来很自然,但BarCreator类的代码太过分了.那你觉得怎么样,哪个最好?
所以我是iOS开发的新手,我正在尽我所能去学习"最好"的做事方式.(是的,我知道这是一个相对的术语)
我来自一个C#和Java世界,我们通过IOC容器注入依赖项,使用存储库模式抽象数据访问,使用域服务和对象来封装业务数据和行为等等.这些都是我的事情.还没有在iOS开发中看到.(也许我在寻找错误的地方)
我意识到Objective-C是C的超集和动态/松散类型的语言,当涉及到良好的设计实践时,它可能会改变游戏.任何人都可以指点我的一些书籍/博客/其他方面的指示,这将有助于我从一个强类型,有管理的环境到这个新世界的精神飞跃,同时保持我的设计柔顺和遵守SOLID原则?
编辑 - 我想在这里说清楚. 我不是在问如何学习Cocoa框架以及Objective-C作为一种语言的来龙去脉.我发现了很多资源.我希望将其提升到一个新的水平,开始进行TDD并确保我正在构建的项目易于扩展和维护.
介绍
我研究了关于继承问题的硕士论文,并找出了一些表明存在遗传问题的指标.
如下例所示:
例
public static String getAnimalNoise(Animal animal) {
if (animal instanceof Dog)
return "Woof";
if (animal instanceof Cat)
return "Miau";
return "";
}
Run Code Online (Sandbox Code Playgroud)
"Woof"如果给定的Animal实例是a Dog并且"Miau"它是a ,则该方法返回String Cat.空绳子,因为有些动物根本没有噪音.
因此,正确的解决方案应该是使用多态与getNoiseAnimal类中的Method.
我已经分析了继承问题的不同指标,并想说一些是否违反了SOLID原则.
我认为上面的例子违反了:
但我不确定这是否适用于所有人.
我想:
原则上的违规行为
SRP违规
因为条件语句完全违反了SRP,因为像switch语句或多个if-else语句一样会考虑多个责任.
它存在两种情况,因此改变方法的原因不止一个.
OCP违规
因为如果添加新动物,必须在方法中添加新案例,因此方法不会接近修改.
LSP违规
每个分支执行依赖于动物子类型的不同动作.我认为这违反了LSP?!我知道矩形和正方形以及getArea的例子,但我认为这些例子也适用于违规.
DIP VIOLATION
条件语句具有依赖性,这意味着语句依赖于细节,而不依赖于违反DIP的抽象.
题:
因此,对于给定的例子,问题是真正违反的给定原则并且推理是否正确?
我正在尝试使用SOLID原理学习更好的编程实践.在这里,我正在研究Shapes的示例应用程序.我只是想知道,我在任何地方都违反了原则.下面是类及其代码.
1.基类 - 形状
public abstract class Shape
{
public abstract double Area();
public virtual double Volume()
{
throw new NotImplementedException("You cannot determine volume from here...Method not implemented.");
}
}
Run Code Online (Sandbox Code Playgroud)
2.实现基类Shape的矩形,三角形等形状的类.
public class Circle : Shape
{
public int Radius { get; set; }
public override double Area() { return 3.14 * Radius * Radius; }
}
public class Triangle : Shape
{
public int Height { get; set; }
public int Base { get; set; }
public override double …Run Code Online (Sandbox Code Playgroud) 我问自己,外观模式是否违反了 SOLID 原则,以及模式本身是否是反模式。
更新
我的意见:
违反了OCP,因为你会在facade中添加更多的方法
LSP / ISP被违反,因为消费者/客户端有依赖,会有太多客户端不需要的方法。
DIP,在我看来,只要接口本身只公开抽象或 DTO,就不会被违反。
SOLID一般是我约的意见小,稳定,从而组合的接口。
一个门面往往是相反的大和不稳定。
我已经开始将SOLID 原则应用到我的项目中。所有这些对我来说都很清楚,除了依赖倒置,因为在 Python 中,我们没有改变在另一个类中定义某个类的类型的变量(或者可能只是我不知道)。所以我以两种形式实现了依赖倒置原则,想知道哪一种是正确的,我该如何纠正它们。这是我的代码:
d1.py:
class IFood:
def bake(self, isTendir: bool): pass
class Production:
def __init__(self):
self.food = IFood()
def produce(self):
self.food.bake(True)
class Bread(IFood):
def bake(self, isTendir:bool):
print("Bread was baked")
Run Code Online (Sandbox Code Playgroud)
d2.py:
from abc import ABC, abstractmethod
class Food(ABC):
@abstractmethod
def bake(self, isTendir): pass
class Production():
def __init__(self):
self.bread = Bread()
def produce(self):
self.bread.bake(True)
class Bread(Food):
def bake(self, isTendir:bool):
print("Bread was baked")
Run Code Online (Sandbox Code Playgroud) solid-principles ×10
c# ×3
oop ×3
.net ×1
facade ×1
inheritance ×1
ios ×1
objective-c ×1
php ×1
python ×1
python-3.x ×1
single-responsibility-principle ×1
yagni ×1