Objects and Data Structures
Date Abstraction
Hiding implementation is not just a matter of putting a layer of fucntions between the variables.Hiding implementation is about abstractions!A class does not simply push its varivables out through getters and setters.Rather it exposes abstract interfaces that allow its users to manipulate the essence of data, without having to know is implementation.
Data/Object Anti-Symmetry
Procedual code makes it hard to add new data structures because all the functions must change.OO code makes it hard to add new functions because all the classes must change.
In any complex system there are going to be times when we want to add new data types rather than new functions.For these cases objects and OO are most appropriate.On the ohter hand,there will also be times when we'll want to add new functions as opposed to data types.In that case procedual code and data structures will be more appropriate.
The Law of Demeter
There is a well-known heuristic called the Law of Demeter that says a module should not know about the innards of the objects it manipulates.As we saw in the last section,objects hide their data and expose operation.This means that an object should not expose its internal structure throught accessors because to do so is to expose,rather than to hide,its internal structure.
More precisely, the Law of Demeter says that a method f of a class C should only call the methods of these:
C
An object created by f
An object passed as an argument of f
An object held in an instance variable of C
The method should not invoke methods on objects that are returned by any of the allowed functions.In other words,talk to friends,not to strangers.
Train Wrecks
This kind of code is often called a train wreck because it looks like a bunch of coupled train cars.Chains of calls like this are generally considered to be sloppy style and should be avoided.
Hybrids
The confusion sometimes leads to unfortune hybrid structures that are half object and half data structure.They have functions that do significant things,and they also have either public variables or public accessors and mutators that, for all intends and purpose,make the private variables public,tempting other external functions to use those variables the way a procedural program would use a date structure.
Such hybrids male it hard to add new functions but also make it hard to add new data structures.They are the worst of both worlds.Avoid creating them.They are indicative of a muddled design whose authors are unsure of -or worse,ignorant of-whether they need protection from functions or types.
Hiding Structure
Data Transfer Objects
The quintessential form of a data structure is a class with public variables and no functions.This is sometimes called a data transfer object, or DTO.DTOs are very useful structures,especialy when communicating with databases or parsing messages from sockets,and so on.They often become the first in a serious of translation stages that covert raw data in a database into objects in the application code.Beans have private variables manipulated by getters and setters.The quasi-encapsulation of beans seems to make some OO purists feel better but usually provides no other benefit.
Active Record
Active Records are special forms of DTOs.They are data structures with public variables;but they typically have navigational methods like save and find.Typically these
Active Records are direct translations from database tables, or other data sources.
Unfortunately we often find that developers try to treat these data structures as though they were objects by putting business rule methods in them.This is awkward because it creates a hybrid between a date structure and an object.
The solution is to treat the Active Record as a data structure and to create separate objects that contain the business rules and that hide thier internal data.
Conclusion
Objects expose behavior and hide data.This makes it easy to add new kinds of objects without changing existing behaviors.It also makes it hard to add new behaviors to existing objects.Data structures expose data and habe no significant behavior.This makes it easy to add new behaviors t existing data structures but makes it hard to add new data structures to existing functions.
Objects and Data Structures的更多相关文章
- Clean Code – Chapter 6 Objects and Data Structures
Data Abstraction Hiding implementation Data/Object Anti-Symmetry Objects hide their data behind abst ...
- The Swiss Army Knife of Data Structures … in C#
"I worked up a full implementation as well but I decided that it was too complicated to post in ...
- Python Tutorial 学习(五)--Data Structures
5. Data Structures 这一章来说说Python的数据结构 5.1. More on Lists 之前的文字里面简单的介绍了一些基本的东西,其中就涉及到了list的一点点的使用.当然,它 ...
- (转) Data structures
Data structures A data structure is a group of data elements grouped together under one name. Thes ...
- 20162314 《Program Design & Data Structures》Learning Summary Of The Fifth Week
20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Fifth Week ...
- 20162314 《Program Design & Data Structures》Learning Summary Of The Eleventh Week
20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Eleventh We ...
- [TypeScript] Custom data structures in TypeScript with iterators
We usually think of types as something that can define a single layer of an object: with an interfac ...
- [译]The Python Tutorial#5. Data Structures
[译]The Python Tutorial#Data Structures 5.1 Data Structures 本章节详细介绍之前介绍过的一些内容,并且也会介绍一些新的内容. 5.1 More ...
- Operating system management of address-translation-related data structures and hardware lookasides
An approach is provided in a hypervised computer system where a page table request is at an operatin ...
随机推荐
- js 格式验证总结
1.身份证号验证 var Common = { //身份证号验证 IsIdCardNo: function (IdCard) { var reg = /^\d{15}(\d{2}[0-9X])?$/i ...
- Farseer.Net
Farseer.Net V0.2 ORM开源框架 目录 http://www.cnblogs.com/steden/archive/2013/01/22/2871160.html V1.0教程:htt ...
- php变量与数组相互转换的方法(extract与compact
#php变量与数组相互转换的方法(extract与compact) #compact 多个变量转数组 $name = 'sui'; $email = 'sui@qq.com'; $arr = comp ...
- cisco nat
1.配置端口: int s0/0 ip nat outside ;s0/0为外部端口 int f0/0 ip nat inside ...
- mysql启动错误
1.启动时,显示ERROR tail localhost.localdomain.err 错误日志 2.新增目录,启动成功
- 在Html中使用JavaScript的几点小结
前言 越发的意识到JS这门作为前端语言的重要性.所以下定决心这段时间在项目允许的情况下花大量时间在学习JS上.争取让自己的前端功底深厚一点. 小结 在包含外部js文件时,必须将src属性设置为指向相应 ...
- xampp搭建服务器环境、html5新的input类型
怎么让别人看见你写的 先把你的文档放入htdocs里面 再输入网址: http://你的IP地址/文件名 就ok了例如我的 HTML5中的input类型: <input>标签规定用户可输入 ...
- mysql的binlog
mysql> show global variables like '%bin%'; +---------------------------------+------------------- ...
- 佳佳的魔法药水 (vijos 1285)
题目大意: 给出N种药水的价格,然后给出一些形如A B C 的关系,表示 A药水+B药水 可以组合出 C药水(保证 A+B 不会得到多种药水). 要求得到1号药水的最少花费和相应的方案数. N< ...
- jpcap
1.System.out.println( System.getProperty("java.library.path")); 2.将jpcap.dll放到上边打印的路径中