标签: solid-principles

编写做一件事并做得好的程序

我可以通过封装,依赖注入,最少知识原则,你不需要它来掌握"做一件事"的部分; 但我怎么理解第二部分"做得好"?

给出的一个例子是完整性的概念,在同一篇YAGNI文章中给出:

例如,在允许添加项目,删除项目或修改项目的特征中,可以使用完整性来推荐"重命名项目".

但是,我发现这样的推理很容易被滥用到特征蠕变中,从而违反了"做一件事"的部分.

因此,看到相当一个特征属于"做得好"类别(因此,将其包含在函数/类/程序中)或其他"做一件事"类别(因此,排除它)的试金石是什么? ?

第一部分,"做一件事",最好通过UNIX的ls命令来理解,因为它包含了过多的标志来格式化它的输出,这些标志本应完全委托给另一个外部程序.但我没有一个很好的例子来看第二部分"做得好".

什么是一个很好的例子,删除任何进一步的功能将使它不"做得好"?

single-responsibility-principle yagni solid-principles

9
推荐指数
1
解决办法
739
查看次数

我是否正确理解DI/IoC?

我目前正在尝试学习使用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

8
推荐指数
1
解决办法
396
查看次数

PHP中的依赖倒置原则

由于PHP是一种松散类型的语言,如何在PHP中应用DIP原则?

一个实际的例子将不胜感激.

php oop solid-principles dependency-inversion

8
推荐指数
1
解决办法
2334
查看次数

推荐一种设计模式

我正在处理的一个应用程序处理工作项.根据工作项的状态,可以使用许多操作."完成""取消""重新分配"等...

为了提供动作的功能,我现在有一个看起来像这样的界面......

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)

问题是,如果我想添加一个新动作,请说......"委托"我必须更新界面,当然这对所有实现都有影响.

这违反了开/关原则吗?你能推荐一个可以帮助我的设计模式或重构吗?

c# design-patterns solid-principles

8
推荐指数
1
解决办法
513
查看次数

依赖倒置.对象创建

根据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种解决方案,但所有这些解决方案似乎都有缺点:

  1. 注入对象类型并使用反射
  2. 使用泛型
  3. 使用"服务定位器"并调用Resolve()方法.
  4. 创建一个单独的工厂类并将其注入Foo:

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类的代码太过分了.那你觉得怎么样,哪个最好?

c# dependency-injection solid-principles

8
推荐指数
1
解决办法
791
查看次数

来自C#/ Java世界的iOS Design Pattern等价物?

所以我是iOS开发的新手,我正在尽我所能去学习"最好"的做事方式.(是的,我知道这是一个相对的术语)

我来自一个C#和Java世界,我们通过IOC容器注入依赖项,使用存储库模式抽象数据访问,使用域服务和对象来封装业务数据和行为等等.这些都是我的事情.还没有在iOS开发中看到.(也许我在寻找错误的地方)

我意识到Objective-C是C的超集和动态/松散类型的语言,当涉及到良好的设计实践时,它可能会改变游戏.任何人都可以指点我的一些书籍/博客/其他方面的指示,这将有助于我从一个强类型,有管理的环境到这个新世界的精神飞跃,同时保持我的设计柔顺和遵守SOLID原则?

编辑 - 我想在这里说清楚. 我不是在问如何学习Cocoa框架以及Objective-C作为一种语言的来龙去脉.我发现了很多资源.我希望将其提升到一个新的水平,开始进行TDD并确保我正在构建的项目易于扩展和维护.

design-patterns objective-c ios solid-principles

8
推荐指数
1
解决办法
1857
查看次数

违反了哪些SOLID原则?

介绍


我研究了关于继承问题的硕士论文,并找出了一些表明存在遗传问题的指标.

如下例所示:


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原则.

我认为上面的例子违反了:

  1. 单一责任原则(SRP)
  2. 开放/封闭原则(OCP)
  3. Liskov替换原理(LSP)
  4. 依赖倒置原则(DIP)

但我不确定这是否适用于所有人.

我想:

原则上的违规行为


SRP违规

因为条件语句完全违反了SRP,因为像switch语句或多个if-else语句一样会考虑多个责任.

它存在两种情况,因此改变方法的原因不止一个.

OCP违规

因为如果添加新动物,必须在方法中添加新案例,因此方法不会接近修改.

LSP违规

每个分支执行依赖于动物子类型的不同动作.我认为这违反了LSP?!我知道矩形和正方形以及getArea的例子,但我认为这些例子也适用于违规.

DIP VIOLATION

条件语句具有依赖性,这意味着语句依赖于细节,而不依赖于违反DIP的抽象.

题:


因此,对于给定的例子,问题是真正违反的给定原则并且推理是否正确?

oop inheritance design-principles solid-principles

8
推荐指数
1
解决办法
2612
查看次数

这打破了我的SOLID原则吗?

我正在尝试使用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)

c# solid-principles

8
推荐指数
2
解决办法
348
查看次数

Facade 模式是否违反了 SOLID 原则?

我问自己,外观模式是否违反了 SOLID 原则,以及模式本身是否是反模式。

更新

我的意见:

  • 当您不只是直接调用方法,而是执行诸如事务、日志记录、错误处理(我见过很多次)之类的事情时,就违反了SRP。即使只是调用其他方法,我也有疑问。
  • 违反了OCP,因为你会在facade中添加更多的方法

  • LSP / ISP被违反,因为消费者/客户端有依赖,会有太多客户端不需要的方法。

  • DIP,在我看来,只要接口本身只公开抽象或 DTO,就不会被违反。

SOLID一般是我约的意见稳定,从而组合的接口。

一个门面往往是相反的不稳定

design-patterns facade solid-principles

8
推荐指数
1
解决办法
3362
查看次数

Python 中的依赖倒置

我已经开始将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)

python oop dependency-injection python-3.x solid-principles

8
推荐指数
2
解决办法
3058
查看次数