• [读书笔记] 代码整洁之道(二):对象和数据结构


      第四章注释和第五章格式在工作中不需要太过注意,因为经过深思熟虑的函数命名足以替代到处出现的注释块,同时强大的IDE保证了编码的格式,加上各自的变成习惯,尽量做到整洁美观就行。

    第六章 对象和数据结构

    1. 数据抽象
      平常我们写TO类的时候非常顺手的定义一些private类型的成员变量,然后各自定义他们的getXXX()和setXXX()方法。这样的写法体现了Java的封装性,虽然实现还是暴露了,外部类可以使用这些私有属性,但是我们可以在get和set方法中添加一些权限,来保证数据的安全性。而且有些框架是强制使用get和set方法来给对象赋值和取值(Hibernate)。

    隐藏实现并非只是在变量之间放上一个函数层那么简单。隐藏实现关乎抽象!类并不简单地用取值器和赋值器将其变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现就能操作数据本体。

      作者的观点是使用抽象形态表述数据,以最好的方式呈现某个对象包含的数据。
    
    1. 数据对象的反对称性

    对象把数据隐藏于抽象之后,暴露操作数据的函数;数据结构暴露其数据,没有提供有意义的函数。

    * **过程式的代码**可以很方便的添加函数,其他的形状类不会受影响,但是添加另一个形状类就需要修改函数来实现该新加类的操作。
    
    		class Square {
    			public Point topLeft;
    			public double side;
    		}
    
    		class Rectangle {
    			public Point topLeft;
    			public double height;
    			public double width;
    		}
    
    		class Circle {
    			public Point center;
    			public double radius;
    		}
    
    		class Geometry {
    			public final double PI = 3.141592653589793;
    
    			public double area(Object shape) throws NoSuchShapeException {
    				if (shape instanceof Square) {
    					Square s = (Square) shape;
    					return s.side * s.side;
    				} else if (shape instanceof Rectangle) {
    					Rectangle r = (Rectangle) shape;
    					return r.height * r.width;
    				} else if (shape instanceof Circle) {
    					Circle c = (Circle) shape;
    					return PI * c.radius * c.radius;
    				}
    				throw new NoSuchShapeException();
    			}
    		}
    
    * **面向对象的代码**就会通过继承来实现多态,area()方法就是多态的。如果多一个新的形状类很简单,但是当添加一个函数的时候,所有的形状类都需要修改。
    
    		class Square implements Shape {
    			private Point topLeft;
    			private double side;
    
    			public double area() {
    				return side * side;
    			}
    		}
    		
    		class Rectangle implements Shape {
    			private Point topLeft;
    			private double height;
    			private double width;
    
    			public double area() {
    				return height * width;
    			}
    		}
    		
    		class Circle implements Shape {
    			private Point center;
    			private double radius;
    			public final double PI = 3.141592653589793;
    
    			public double area() {
    				return PI * radius * radius;
    			}
    		}
    
    
    	>过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。
    
    	在实际工作中经常会遇到这种两难的情况,[设计模式——可以参考访问者模式](http://example.net/)(Coming out...)。<br>
    
    1. 迪米特法则
      law of demeter, LKP最少知道原则:一个对象应当对其他对象又尽可能少的了解,不和陌生人说话。也即是方法不应该调用由任何函数返回对象的方法

      例子:类C的方法f只应该调用一下对象的方法:1) C 2) 由f创建的对象 3) 作为参数传递给f的对象 4) 由C的实体变量持有的对象.

    2. 数据传送对象
      最为精炼的数据结构是一个只有公共变量、没有函数的类。称之为DTO,经常用于数据库通信、解析套接字传递的消息之类场景。

  • 相关阅读:
    MFC中处理消息的几个函数之间的区别
    双缓冲技术2
    CxImage简单用法2
    C/C++中 const,extern,static,volatile的使用(转帖)
    用BoundsChecker检测内存泄露2
    用BoundsChecker检测内存泄漏
    TrackMouseEvent函数实现鼠标停留响应
    3D——VTK使用
    防止密码被非法获取
    未来界面设计的主流——WPF技术
  • 原文地址:https://www.cnblogs.com/nextStep/p/4834055.html
Copyright © 2020-2023  润新知