代码之家  ›  专栏  ›  技术社区  ›  Vin Shahrdar

这个建造师是否违反了单一责任原则?

  •  1
  • Vin Shahrdar  · 技术社区  · 7 年前

    我试图强迫自己使用可靠的原则并编写单元可测试代码。最近,我在编写代码时变得偏执和犹豫不决,因为我感觉自己总是违反一些原则。

    考虑下面的课程。JavascriptPropertyInitializer负责检测给定类中具有特殊属性的属性列表,并呈现一些javaScript代码。它是否有太多的责任?构造器做得太多了吗?

    我知道我正在构造函数中实例化一个字典,并且我知道实例化具体对象是已知的违规行为。是的,我知道,我应该通过构造函数注入它,但为什么?依赖一本具体的词典对我们班有什么害处?

    public class JavascriptPropertyInitializer
    {
        private readonly HtmlTextWriter _writer;
        private readonly object _containerObject;
        private readonly string _javascriptObjectName;
        private readonly Dictionary<string, string> _settings;
        private List<PropertyInfo> _customWebControls;
    
        public JavascriptPropertyInitializer(HtmlTextWriter writer, object containerObject, string javascriptObjectName)
        {
            _writer = writer;
            _containerObject = containerObject;
            _javascriptObjectName = javascriptObjectName;
            _settings = new Dictionary<string, string>();
            ValidateParameters(writer, containerObject, javascriptObjectName);
            DetectCustomWebControls();
            CollectSettings();
        }
    
        public void Render() 
        {
            RenderJSProperties();
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   LazyLoadedPrinciples    7 年前

    这里的字典几乎是一种原始类型;它用于存储键值对,而不是其他(?)。我看不出你需要把它换成不同的实现,这也是IOC有用的地方。 作者在IOC中更有意义(你做到了):我可以看到以后需要以xml或字符串等形式输出。

    在“责任太多”方面。根据您描述此类功能的句子,1)检测特殊属性,2)呈现一些js。这里可能存在分裂的可能性。如果这个类只是检测到属性并在C#对象中返回那些检测到的属性,该怎么办。然后其他一些类,可能是JavascriptRenderer,可以接受这些属性并转换为javascript。

    var pi = JavascriptPropertyInitializer(containerObject, javscriptObjectName);
    var r = JavascriptRenderer(writer);
    var output = r.Render(pi.DetectAttributes());
    

    我也经常发现自己对不遵循编码原则感到偏执。在这个时候,我只是尽我最大的努力。当原则显而易见或有用时,我会运用原则,但当我不确定时,我会尽量不太担心,继续前进。我安慰自己,当代码变得难以处理时,我可以回去重构。

        2
  •  1
  •   Alex Netkachov    7 年前

    单一责任原则定义如下:

    一个类应该只有一个更改的原因。

    因此,这一切都是为了找到正确的措辞。然而,原因只有在上下文中才有意义,换句话说,在特定的抽象层次上。通过移动抽象层次,代码改变了其对单一责任原则的一致性。

    您的经验可能与这样一个事实有关,即您对所使用的框架的知识有所提高,因此您的理解正在转向更具体的抽象(接近框架内部)。在这个级别上,您的代码做得太多了(因为您预见到了许多需要更改的原因)。做一个心理练习,尝试转移到应用程序的抽象,它做什么,为什么做,并重新评估与SRP的一致性。