代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

我在哪里可以找到一个简洁的、写得很好的论据来反对这个初始化反模式,还有可能是其他的呢?[关闭]

  •  1
  • Dan Tao  · 技术社区  · 14 年前

    我的一个同事倾向于设计类,比如:

    class ImportantClass
    {
        public SomeClass ImportantField;
        public SomeOtherClass OtherImportantField;
        // etc.
    }
    

    ImportantClass x;
    
    try
    {
        // This is problematic enough to begin with, as every field (which is public)
        // is set manually, which causes code duplication wherever this type is
        // instantiated as well as maintenance problems in the event new fields are
        // introduced or internal implementation is changed.
        x = new ImportantClass();
        x.ImportantField = new SomeClass();
        x.OtherImportantField = new SomeOtherClass();
    }
    catch (Exception ex)
    {
        // ...what's even worse: now x can easily be in a totally invalid state,
        // with some fields initialized and some not.
        HandleAnyException(ex);
    }
    

    很明显,上面的例子过于简单(而且夸张了);但我想你明白了。

    我发这篇文章不是为了批评我的同事;相反,我想让他明白在开发这样的课程时存在的许多问题,并为他指出正确的方向。我个人觉得这个设计虽然很差,但很容易“修好”

    我主要关心的是 如果我想说服他,对我来说,有一个有力的(有力的支持),容易理解和简洁的论点对我来说是很重要的 (他不会想看一封两页的电子邮件,告诉他为什么我认为他的代码需要更改)。

    有没有什么好的资源可以提供这种精心设计的论据,解决这种模式以及其他不明智的设计反模式的缺点?类似于“常见软件设计错误”的概要,如果存在的话,将会非常有帮助。

    :我意识到,简单地谈论它是提供建议的最直接和最不具破坏性的方式;我只是在想,如果有这样一种资源存在,我可以把它作为参考资料来引用。

    5 回复  |  直到 14 年前
        1
  •  2
  •   Ignacio Vazquez-Abrams    14 年前

    违反了责任原则。如果 ImportantClass 在发生其他事情之前确保他们处于已知良好状态的责任。

        2
  •  2
  •   Spektr    14 年前

    如果实例字段是非final的,或者 是对可变变量的最终引用 公众,你放弃了 田野。这意味着你也放弃了 执行不变量的能力 涉及领域。还有,你放弃了 在以下情况下采取任何行动的能力 字段已修改,因此使用 公共可变字段不是 引用一个不可变的对象,通过 切换到新的

    这本书对如何安全正确地进行对象初始化也有很多要说的。可以说,您发布的代码有很大的问题。

        3
  •  1
  •   Ignacio Vazquez-Abrams    14 年前
        4
  •  1
  •   JohnP    14 年前

    你可以告诉他,这种编码方法违反了面向对象开发的三个基本概念之一,当然这三个概念就是封装。

    事实上,用户可以直接修改对象的状态,这使得调试变得非常困难,而私有方法是访问内部数据的唯一方法。。。

    但事实是,与过去相比,在最近几年中,OO系统中数据封装的应用已经放宽了。

    这种趋势的一个直接结果是C最近采用了自动属性,这些属性被用来简化私有数据的直接暴露,如set/get属性。。。

        5
  •  1
  •   Community CDub    4 年前

    它违反了 Principle of Least Astonishment

    一些引用 http://portal.acm.org/citation.cfm?id=1176622 :

    保持API不包含实现细节。它们混淆了用户并抑制了进化的灵活性。实现细节是什么并不总是显而易见的:小心过度指定。