Blog


《敏捷软件开发:原则、模式与实践》笔记(4)

  • 2019年3月25日
  • 读书

第 10 章 Liskov 替换原则(LSP)

一个模型,如果孤立的来看,并不具有真正意义上的有效性。模型的有效性只能通过它的客户程序来体现。能解决问题的模型才是好模型

IS-A 的关系是就行为方式而言的。Rectangle 可以单独设置长宽,Square 不可以,他们的行为是不一致的。(但如果边长只能在创建时设置,那其余部分的行为是可以一致的。所以还是要看如何使用。)

可以通过编写单元测试的方法指定契约(约定,如 Rectangle 设置完 width 之后 height 不变)。

(未完待续)

版权所有,转载请注明出处:
https://sickworm.com/?p[……]

Read more




Sublime Android Studio Logcat 高亮语法插件

网上找的都是旧的 Logcat 格式,Android Studio 日志格式不适配。于是自己改了一个:

https://gist.github.com/sickworm/8ae911809f29c38767171767aed2ed3d

使用方法:
点击 Preferences -> Browse Packages(Windows)或 Sublime Text -> Preferences -> Browse Packages(Mac),把上面的文件扔进 User 文件夹中,重启,打开日志文件,右下角选择 Logcat (Android Studio)。

默认识别 *.log, *.logcat[……]

Read more




《敏捷软件开发:原则、模式与实践》笔记(3)

  • 2019年3月17日
  • 读书

第二部分 敏捷设计

敏捷团队不会花费许多时间去预测未来的需求和需要,也不会试图在今天就构建一些基础结构去支撑那些他们认为明天才会需要的特性。

第 7 章 什么是敏捷设计

软件系统的源代码是它的主要设计文档,用来秒回源代码的图示只是设计的附属物而不是设计本身。

设计的臭味:

  • 僵化性(Rigidity):很难对系统改动,一个改动需要其他部分一起改动。
  • 脆弱性(Frgility):系统的改动会导致其他概念无关的地方出现问题。
  • 牢固性(Immobility):很难解开系统,抽取出重用组件。
  • 粘滞性(Viscosity):做正确的事情比做错误的事情更难。(实现或变更一个需求时,生硬的方法很简[……]

Read more




《敏捷软件开发:原则、模式与实践》笔记(2)

  • 2019年3月10日
  • 读书

第六章 一次编程实践

原文保龄球规则:(文末)

https://www.twblogs.net/a/5b957acb2b717750bda47bd5/zh-cn/

原文需求:

记录一届保龄球联赛的所有比赛,确定团队等级,确定每次周赛优胜者和失败者,每场比赛成绩

初步分析数据结构:

  1. 计分数据

不存储最终该轮得分,该轮得分由函数提供计算,防止冗余数据和出现数据冲突。

  1. 团队数据

  1. 比赛数据

[crayon-5c98c6e79cc7680[……]

Read more




《敏捷软件开发:原则、模式与实践》笔记

  • 2019年3月2日
  • 读书

第一章:敏捷实践

敏捷开发要点节选:

  • 结对编程
  • 集体代码所有权:所有人可以在任何时候改进所有代码
  • 隐喻:团队提出一个程序工作原理的公共景象

如果把程序员团队当做是组件(component),那么就无法对他们进行管理。人不是“插入即兼容的编程装置”。如果想要项目取得成功,就必须构建具有合作精神的,自组织的(self-organizing)的团队。

一个大而笨重的过程会产生它本来企图去解决的问题。它降低了团队的开发效率,使得进度延期,预算超支。它降低了团队的相应能力,使得团队经常创建错误的产品。

代码是唯一没有二义性的信息源。

计划会遭受形态(shape)上的改变,而不仅仅是日期上[……]

Read more




深入理解计算机系统(第三版)/ CSAPP 杂谈,第12章:并发编程

  • 基于进程的并发编程:accept 后 fork。优点:虚拟空间独立,不容易出 bug;缺点:创建进程开销大。需要处理 SIGCHLD 来回收僵死子进程。
  • 基于 I/O 多路复用:传递待读描述符集合给 select 函数,以此响应所有描述符的 I/O 事件。select 会修改描述符集合,改为可读子集返回,所以每次使用都要重新更新待读描述符集合。

  • 基于 I/O 多路复用的并发事件驱动:保存所有已连接的客户端,每次循环检测监听套接字,然后更新客户端集合,并执行相应操作

  • 状态机就是一组状态(state),输入事件(input event),和转移(transition)

  • 基于线程的并发:accep[……]

Read more




深入理解计算机系统(第三版)/ CSAPP 杂谈,第11章:网络编程

  • IP 协议提供基本的命名方法和递送机制
  • UDP 稍微扩展了 IP 协议(增加端口概念),使其从原来的主机间传送变成可以在进程间传送(通过端口区分不同进程),通讯粒度从主机变为进程
  • TCP 基于 IP 协议提供进程间可靠通信
  • 网络通信总是使用大端传输(网络字节序=大端)
  • Linux,Mac,Windows 都是使用 socket 通信。

  • HTTP 请求由 request line,request header,空行 组成。

  • HTTP 有 GET,P[……]

Read more




深入理解计算机系统(第三版)/ CSAPP 杂谈,第10章:系统级I/O

  • 每个打开的文件,内核都保持着文件位置
  • Linux 每个进程都有当前工作目录
  • stat 和 fstat 可以读取文件的元数据(metadata)
  • readdir 以流形式读取目录内容
  • Linux 使用了 3 个数据结构表示打开的文件:
    1. descriptor table 描述符表。每个进程独立维护,通过打开的文件描述符索引
    2. file table 文件表。所有进程共享,持有 vnode 指针,文件位置,引用计数,引用计数为 0 时删除表项
    3. v-node table v-node 表。所有进程共享,包含 stat 结构的大部分信息。
  • I/O 重定向通过 dup2 函数实现。
  • 标准 I/O 库将[……]

Read more




深入理解计算机系统(第三版)/ CSAPP 杂谈,第9章:虚拟内存

  • 所有程序共享内存资源,这容易造成很多问题。虚拟内存用于管理内存,协调各程序之间的内存占用和释放,但对程序来说无感知。
  • 物理寻址流程:CPU 执行加载指令时,生成一个物理地址,通过内存总线传递给主存。主存取出物理地址对应的内存,并返回给 CPU,CPU 将其存放在寄存器中
  • 虚拟寻址流程:CPU 执行加载指令时,生成一个虚拟地址,通过内存总线传递给主存,主存将其转换成物理地址。主存取出物理地址对应的内存,并返回给 CPU,CPU 将其存放在寄存器中。转换过程叫做地址翻译 address translation。
  • address translation 需要硬件和操[……]

Read more




深入理解计算机系统(第三版)/ CSAPP 杂谈,第8章:异常控制流

  • 异常控制流(Exceptional Control Flow,ECF)是操作系统为应用提供的一种访问处理器资源之外的能力,对应于嵌入式和CPU等硬件的中断概念。
  • 系统调用,进程管理,并发,IO 访问都属于异常控制流。

  • 异常(exception)是控制流的突变,用来处理处理器状态中的某些变化。异常通过事件(event)触发,有专门的异常表(exception table)用于事件的跳转。

  • 每种类型的异常都有唯一的异常号(exception number),有可能是处理器设计时分配的零除,缺页,内存访问违例,断点和算术运算溢出;也可能是操作系统分配的系统调用,外部IO设备信号。操作系统的异常号是[……]

Read more