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

  第四章注释和第五章格式在工作中不需要太过注意,因为经过深思熟虑的函数命名足以替代到处出现的注释块,同时强大的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,经常用于数据库通信、解析套接字传递的消息之类场景。

原文地址:https://www.cnblogs.com/nextStep/p/4834055.html