数据的抽象

生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也可以将他们视为独立的两个部分。这样便提高了我们程序的抽象化和模块化程度,我们便可以对于数据的各个部分进行隔离处理。使得程序更易于设计,维护,和修改。

数据的抽象化和函数的抽象化一样,可以使具体的实现细节封装起来。

数据的抽象化后有两部分:

  1. 对于抽象化数据的操作
  2. 抽象化数据的具体实现细节

例子——有理数:

    • 有理数是任意整数的比值
    • 但由于浮点逼近的存在,会使存在误差
  • 有理数复合结构的构建:
    1. 假设有理数的复合结构已经构建完成

      • 我们可以精确表示有理数
      • 任意一个有理数,我们有办法选择他的分子和分母
    2. 有理数加,减,乘,除的实现
      • def add_rationals(x, y):
        nx, dx = numer(x), denom(x)
        ny, dy = numer(y), denom(y)
        return rational(nx * dy + ny * dx, dx * dy) def mul_rationals(x, y):
        return rational(numer(x) * numer(y), denom(x) * denom(y)) def print_rational(x):
        print(numer(x), '/', denom(x)) def rationals_are_equal(x, y):
        return numer(x) * denom(y) == numer(y) * denom(x)
    3. 复合结构的构建
      • 使用list结构
      • list的两种访问方式
        • 多重分配法

          • >>> pair
            [10, 20]
            >>> x, y = pair
            >>> x
            10
            >>> y
              20
        • 下标访问法

          • >>> pair[0]
            10
            >>> pair[1]
            20
      • >>> def rational(n, d):
        return [n, d]
        >>> def numer(x):
        return x[0]
        >>> def denom(x):
        return x[1]

        约分的实现:

        >>> from fractions import gcd
        >>> def rational(n, d):
        g = gcd(n, d)
        return (n//g, d//g)

抽象壁垒:

Parts of the program that... Treat rationals as... Using only...
Use rational numbers to perform computation whole data values add_rational, mul_rational, rationals_are_equal, print_rational
Create rationals or implement rational operations numerators and denominators rational, numer, denom
Implement selectors and constructor for rationals two-element lists list literals and element selection

    在此表格中的每一层中,高一层都通过调用低一层的功能来实现

  作用

    这样可以使得程序更易于维护,譬如即使我们更改了有理数的表示方法,也不必对相对于其的高级功能进行改动。

总结:

  数据抽象化的复合结构:

    通过选择器与构造函数来实现有效表示

    数据抽象化各层之间存在着壁垒

SICP-2.2-数据的抽象的更多相关文章

  1. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. PDO数据访问抽象层

    PDO数据访问抽象层: 我们使用的mysqli是针对mysql这个数据库扩展的一个类,如果要用到别的数据库的话就可以用PDO来做 1.操作数据库 先来代码 <!--PDO--> <! ...

  3. PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05

    之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...

  4. PHP中关于PDO数据访问抽象层的功能操作

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...

  5. PDO:数据访问抽象层

    <?php //PDO:数据访问抽象层 //带有事务功能: //dsn:数据源 $dsn="mysql:host=localhost;dbname=aaas"; //造pdo ...

  6. SICP— 第一章 构造过程抽象

    SICP  Structure And Interpretation Of Computer Programs 中文第2版 分两部分  S 和 I 第一章 构造过程抽象 1,程序设计的基本元素 2,过 ...

  7. Spark 读写数据、抽象转换 拾遗

    读 package com.test.spark import org.apache.spark.sql.{Dataset, Row, SaveMode, SparkSession} /** * @a ...

  8. PDO 数据访问抽象层

    1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...

  9. PDO(数据访问抽象层)

    自带事务功能,多条sql同时执行时,如果其中一条执行失败,那么所有的都执行失败.开启了事务,可以进行回滚操作,让程序变得更安全. 1.访问不同的数据库2.自带事务功能3.防止SQL注入:分两次发送 / ...

  10. php 之 PDO数据访问抽象层(0513)

    PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口. PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数, 基于数据库使用的安全性,因为后者欠缺对于S ...

随机推荐

  1. iOS刨根问底-深入理解RunLoop

    开源的RunloopRef 通常所说的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的OC ...

  2. json、xml和java对象之间的转化

    其实从面相对象的角度来理解这个问题,就会很清晰.java中的一切皆对象即把世间万物(Everything in the world)看做java对象,任何处理不了的问题都可以先转化成java对象在做处 ...

  3. hdu1421 搬寝室 DP

    转载: /*证明:从4个数中 a b c d  依次递增: 选取相邻的两个数一定是最小得 及:(a-b)^2+(c-d)^2<(a-c)^2+(b-d)^2&&(a-b)^2+( ...

  4. Linux设备中的并发控制

    一.自旋锁1.定义自旋锁:spinlock_t lock2.初始化自旋锁:spin_lock_init(lock)3.获得自旋锁:spin_lock(lock)4.释放自旋锁:spin_unlock( ...

  5. 【原创】JQWidgets-TreeGrid 2、初探源码

    已知JQWidgets的TreeGrid组件依赖于jqxcore.js.jqxtreegrid.js,实际上它还依赖于jqxdatatable.js.我们先通过一个例子,来探索本次的话题. 需求: 图 ...

  6. Oracle 12C 新特性之 PDB热克隆(本地克隆、远端异机克隆)

    说明:版本12.2.0.1 12c r1版本中 clone 一份PDB源库需要打开在read only只读模式 , 在12c r2版本中引入了local undo mode, 源PDB在read/wr ...

  7. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  8. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  9. Java 多线程详解(三)------线程的同步

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  10. 如何自学成为一个WEB前端

    WEB前端是做什么的? 那些什么高大上的介绍作者就略过了,简单来说就是做网页的,我们上网浏览的网站界面就是WEB前端工程师做的. 在互联网迅速发展的近几年,你上网冲浪的时候是不是感觉WEB网站越来越漂 ...