最近在读《代码大全》这本书,第六章说到了一个点,代码应该依赖于公共接口,而不是依赖于类的私用实现。我发现这个点是很多初、中级的程序员都会忽略的点。下面内容来自于书中的原话
比较起来,语义上的封装性和语法上的封装性两者的难度相差无几。从语法角度说,想要避免窥探另一个类的内部实现细节,只要把它内部的子程序和数据都声明为private就可以了,这是相对容易办到的事情。然而,想要达到语义上的封装性就完全是另一回事了。列举一些类的调用方代码从语义上破坏其封装性的例子。
* 不去调用A类的InitializeOperations()子程序,因为你知道A类的PerformFirstOperation()子程序会调用它
* 不在调用emloyee.Retrive(database)之前去调用database.Connect()子程序,因为你知道在未建立数据库连接的时候employee.Retrieve()回去连接数据库
* 不去调用A类的Terminate()子程序,因为你知道A类的PerformFinalOperation()子程序已经调用过它了
* 即便在ObjectA离开作用域之后,仍然去使用由ObjectA创建的、指向的ObjectB的指针或引用,因为你知道ObjectA把ObjectB放置在静态存储空间了,因为ObjectB还可以使用
* 使用ClassB.MAXIMUM_ELEMENTS而不是用ClassA.MAXIMUM_ELEMENTS,因为你知道他们两个值是相等的
这些例子问题在于,它们让调用方代码不是依赖于类的公开接口,而是依赖于类的私用实现。每当你发现自己是通过查看类的内部实现来得知该如何使用这个类的时候,你就不是在针对接口编程了,而是在透过接口针对内部实现编程。如果你透过接口来编程。封装性就被破坏了,而一旦封装性开始遭到破坏,抽象能力也就遭殃了。
看到这一点的时候,发现自己之前并没有太注意到这个问题,之前很多代码都建立在了已经知道类的内部实现这一个点。这样实际上会破坏类的封装性。今天把这一小点写在这里,以后写代码要加强注意
网友评论