新农上路
- 积分
- 95
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-9-18
- 最后登录
- 1970-1-1
|
Week 5 ~ 6a:
进度推进地比较慢,继续坚持,完成了Week6的lecture部分,大部分精力花在作业上,不得不赞一下这门课程的设计者的用心,推荐大家一定要认真完成Homework,lab和project(Project 2现在还没有着手开始弄,努力!)
Lecture:
1. Package 概念,将不同代码分配在不同的包里,也是在消除代码复杂度,方便更好地管理,大型项目中这是特别好的策略。不由地想起了Python项目中的cookie cutter,利用脚手架自动生成代码。
2. Access control, 主要介绍了private, protected, (package private), public 修饰符的用法,之前没有接触过的是省略不写就是package private,作用依然是封装,对外暴露合适的接口而隐藏实现细节。留意:虽然package private在子类中不可见,但是如果在同一个package的子类依然可见。
3. Objects中的特定方法,这个我是完全类比Python的Magic Methods,比如toString对应__str__/__unicode__, hashCode对应__hash__
4. ADT和API设计的一些原则,这也是我特别感兴趣的一部分,都说优雅的API设计,什么才算优雅?多少算优雅?我觉得还是要靠经验积累,多看别人的源代码才会慢慢有感觉,前几天看了Kennith的records源代码,挺赞叹OOP的设计方式的。其中提到了Uncle Bod 的 SOLID的设计原则:
1. Single responsibility principle: 我理解不要让一个类承担太多的职责,比如一个Caculator类,不要让它去format最后的计算结果而是另用一个Formatter类;Python的logging模块完美地诠释了这一点,有formatter,handler,emitter,各司其职;
2. Open-closed principle: 可扩展性,不破坏已有类的情况响应变化,听说linus写git时,基本数据结构在后面迭代时没有被修改过,这就是一个特别好的例子;
3. Liskov substitution principle: 在继承的时候需要多考虑一层,比如square和rectangle的例子,如果square继承rectangle,那么square中就会有rectangle里的setWidth和setHeight的方法,显然这些方法在square中是有问题的;这就违反了liskov原则
4. Interface segregation principle: 不应该强迫去实现一些实际上我们不会用到的接口,而更多用Plugin的方式插入;
5. Dependency Inversion principle:实体不应该依赖具体实现层,应该用接口替代。比如:不应该直接给MySQL的数据库连接,而是一个抽象意义的数据库连接接口,提倡面向接口而不是面向实现
5. 区分Delegation 和 extension, 什么时候使用继承(extension),什么时候使用组合(Delegation)
Practice:
1. Project2 的基本地图绘制任务,如何把一个问题拆解成若干问题,并且组织在代码里面实现出来,it needs practice;
2. HW1 的GuitarHero:温习Interface,AbstractClass等基本概念,话说那个midi旋律特别酷炫
3. 作业中有一个任务:设计一个停车场,我学到了先不着急进入实现细节,而是充分设计好接口,然后再敲键盘,强烈推荐大家把它实现,涉及到PriorityQueue,Map等数据接口的使用
终于要全力搞Project2了!
|
|