English 中文(简体)
使用配置类或参数实例化对象
原标题:
  • 时间:2008-12-29 22:14:24
  •  标签:

我正在和一位同事有关设计的分歧中,并希望听取人们对对象构造器设计的意见。简而言之,你更喜欢哪种对象构造方法,为什么?

    public class myClass
    {
        Application m_App;

        public myClass(ApplicationObject app) 
        { 
             m_App = app;
        }  
        public method DoSomething 
       { 
         m_App.Method1();
         m_App.Object.Method();
       }
    }

或者

    public class myClass
    {
        Object m_someObject;
        Object2 m_someOtherObject;

        public myClass(Object instance, Object2 instance2) 
        { 
             m_someObject = instance; 
             m_someOtherObject = instance2;
        }  
        public method DoSomething 
       { 
         m_someObject.Method();
         m_someOtherObject.Method();
       }
    }

背景是我今天遇到了一个根本不同的构造对象的视角。当前,对象是使用包含应用程序的所有当前设置(事件日志目标,数据库字符串等)的Application类构造的。因此,每个对象的构造函数都是这样的:

public Object(Application)

许多课程个别持有对这个应用程序类的引用。在每个类中,应用程序的值根据需要被引用。例如:

Application.ConfigurationStrings.String1 or Application.ConfigSettings.EventLog.Destination

最初,我认为您可以使用两种方法。问题在于,当您在调用堆栈的底部调用参数化构造函数时,当堆栈较高处的新对象期望存在应用程序对象的引用时,我们遇到了许多空引用错误并看到了设计缺陷。

我对使用应用程序对象来设置每个类的感觉是,它会打破每个对象的封装,并允许应用程序类成为一个包含所有信息的上帝类。当考虑到这种方法的缺点时,我遇到了问题。

我想改变对象构造函数的设置,只接受需要的参数,这样public object(Application) 将变为 public object(classmember1, classmember2等等...)。我目前认为这样更容易测试,隔离变化,并且不会混淆必需传递的参数。

目前,另一位程序员看不出区别,我很难找到例子或好的理由来改变设计,而仅仅依靠我的直觉,并违背我所知道的面向对象的原则,这不是一个有说服力的论点。我的设计想法错了吗?有没有人有什么支持一方或另一方的观点?

最佳回答

地狱,为什么不只是创建一个名为“做”的巨大类,一个名为“它”的方法,并将整个宇宙传递给It方法?

Do.It(universe)

尽量保持事物尽可能小。离散意味着当事情不可避免地发生故障时更容易调试。

问题回答

我的观点是,你应该为课程提供最小的“必需材料”以便它完成工作。“应用程序”方法在最初阶段更容易,但正如你已经看到的那样,它会导致维护问题。

我认为史蒂夫·麦康奈尔表述得非常简洁明了。他说:

"The difference between the convenience philosophy and the intellectual manageability philosophy boils down to a difference in emphasis between writing programs and reading them. Maximizing scope may indeed make programs easy to write, but a program in which any routine can use any variable at any time is harder to understand than a program that uses well-factored routines. In such a program you can t understand only one routine; you have to understand all the other routines with which that routine shares global data. Such programs are hard to read, hard to debug, and hard to modify." [McConnell 2004]

我不至于称 Application 对象为“上帝”类;它真的像是一个实用类。为什么它不是一个公共静态类(或者更好的,一组类),其他类可以随意使用?





相关问题
热门标签