数据抽象

目录:

1.复合数据

2.数据抽象

3.抽象壁垒

 

数据抽象

复合数据:将多个数据绑定在一起,如日期、经纬度。

函数为数据的表示与操作构建抽象壁垒的方法论。

数据抽象允许我们将符合数据视作操作的基本单位。

数据抽象将数据的表示与操作分离开:

-单个数据如何表示为一个整体(as parts)

-作为一个整体的数据如何进行操作(as unit)

实例

以程序来表示分数间的各种操作(假设分子和分母都为正整数)

首先,分数由两部分组成,numerator(分子)和denominator(分母),其为一对数值,即复合数据。写作:

要对两个分数进行运算,必须对其分子和分母进行相应操作。

那么如何表示作为整体(unit)的分数与部分的分子与分母?其实现暂且不论,就结果来看,要实现的是这样一种效果:

rational函数返回一个分数

number和denom函数分别返回这个分数的分子与分母

因为rational是构造分数的方法,因此称之为Constructor;

numer和denom是从数据对(分数)中选择特定部分的方法,因此称之为Selector。

仍旧不去管如何实现,只以此为基础完成基本操作。(这里只实现加、乘、比较相等与格式化打印的操作)

图示如下:

 

 

代码

def mul_rational(x, y):
    return rational(numer(x) * numer(x),
                    denom(x) * denom(x))


def add_rational(x, y):
    nx, ny = numer(x), numer(y)
    dx, dy = denom(x), denom(y)
    return rational(nx * dy + ny * dx, dx * dy)


def equal_rationals(x, y):
    return numer(x) * denom(y) == denom(x) * numer(y)


def print_rational(x):
    print(numer(x), '/', denom(x))

接下来我们再完成各个函数的实现

首先我们先以形如[n, d]的列表形式表示分数

代码

from fractions import gcd

# 以列表表示分数
# Constructor
def rational(n, d):
    g = gcd(n, d)
    return [n//g, d//g]

# 由分数求得分母
# Selector
def numer(x):
    return x[0]


# 由分数求得分子
# Selector
def denom(x):
    return x[1]

如果换一种分数的表示方式呢?这次用函数来表示一个分数,以特定参数调用函数表示分母和分子。

即便改变如此之大,高一层的抽象,即分数间的操作是不用做任何改变的,要改变的只是分数及其部分的表示形式。

代码

# 以函数表示分数
# Constructor
def rational(n, d):
    def select(name):
        if name == 'n':
            return n
        elif name == 'd':
            return d
    return select


# Selector
def numer(x):
    return x('n')


# Selector
def denom(x):
    return x('d')

 

抽象壁垒

以上的代码中,用两种方式实现了分数及其部分的实现方法,但建诸其上的分数操作却完全不用改变。

这里就涉及到了抽象的层级。在当前问题的语境内可以分隔出以下的抽象层级:

 

各抽象层级间的粗线表示抽象层级间的壁垒。在实现程序时,不要实现去做跨越层级的操作,如下图:

这样会使程序的抽象结构慌乱不堪,程序也因之变得脆弱。一旦要对某一部分进行修改,整个程序都会不再稳定。

 

参考

https://cs61a.org/assets/slides/10-Data_Abstraction_1pp.pdf

http://composingprograms.com/pages/21-introduction.html

《改变:问题形成和解决的原则》中关于第二序改变的论述

转载于:https://www.cnblogs.com/yifeixu/p/9038559.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的海滨体育馆管理系统,源码+数据库+毕业论文+视频演示 本基于Spring Boot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理,提高管理效率,使得海滨体育馆管理工作规范化、高效化。 本文重点阐述了海滨体育馆管理系统的开发过程,以实际运用为开发背景,基于Spring Boot框架,运用了Java技术和MySQL作为系统数据库进行开发,充分保证系统的安全性和稳定性。本系统界面良好,操作简单方便,通过系统概述、系统分析、系统设计、数据库设计、系统测试这几个部分,详细的说明了系统的开发过程,最后并对整个开发过程进行了总结,实现了海滨体育馆相关信息管理的重要功能。 本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高海滨体育馆管理效率。 关键词:海滨体育馆管理,Java技术,MySQL数据库,Spring Boot框架 本基于Spring Boot的海滨体育馆管理系统主要实现了管理员功能模块和学生功能模块两大部分,这两大功能模块分别实现的功能如下: (1)管理员功能模块 管理员登录后可对系统进行全面管理操作,包括个人中心、学生管理、器材管理、器材借出管理、器材归还管理、器材分类管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理、灯光保修管理、体育论坛以及系统管理。 (2)学生功能模块 学生在系统前台可查看系统信息,包括首页、器材、体育论坛以及体育资讯等,没有账号的学生可进行注册操作,注册登录后主要功能模块包括个人中心、器材管理、器材借出管理、器材归还管理、校队签到管理、进入登记管理、离开登记管理、活动预约管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值