它是一ç§å®žè·µ
é¢å‘å¯¹è±¡ä¸æ˜¯ç¼–程模型而是一ç§äººä»¬æ€»ç»“出的实践,它优于过程化或模å—化编程方å¼ã€‚
哲å¦
å®ƒçš„å“²å¦æ˜¯æ‹‰è¿‘现实物体或概念与程åºå®žä½“之间的è·ç¦»ï¼Œä¸ä»…将程åºä¸çš„å‚与å•元看作对象并将对象归类,而且在对现实物体以对象的方å¼å»ºæ¨¡ä¸ï¼Œå°†å„对象作为属性的数æ®çº³å…¥å„自结构,并与其相关行为组织在一起;å¦å¤–,还通过继承或组åˆç‰æ–¹å¼æè¿°å®žä½“é—´çš„å˜åœ¨çš„æ•°æ®æˆ–行为的关系。
å½¢å¼
é¢å‘对象编程è¯è¨€æœ‰ä¸¤ç§å½¢å¼ï¼ŒåŸºäºŽç±»åž‹ï¼ˆclass-based)和基于原型(prototype-based)。
- 基于类型的形å¼è‡ªC++æ—¶ä»£å°±ç¡®ç«‹äº†åœ¨é™æ€è¯è¨€ä¸çš„ç»å¯¹åœ°ä½ï¼Œå®ƒæ˜Žç¡®æå‡ºç±»åž‹çš„æ¦‚念,认为对象都是类型的实例化;类型通过继承的方å¼é‡ç”¨å…¶ä»–类型的属性和方法。å¯ä»¥ç”¨â€œis-aâ€æ¥è§£é‡Šä¸Šè¿°ä¸¤å…³ç³»ï¼šæˆ‘们å¯ä»¥è¯´å¯¹è±¡æ˜¯ä¸€ä¸ªç±»åž‹çš„具体化,也å¯ä»¥è¯´ç»§æ‰¿è‡ªç±»åž‹B的类型A是类型B的一个派生。基于类型的形å¼åœ¨é‡ç”¨å…¶ä»–类型的行为方é¢çš„还有å¦ä¸€ç§æ–¹å¼å«ç»„åˆï¼Œå®ƒå°†ç±»åž‹B的对象作为类型A的属性,以便直接使用。å¯ä»¥ç”¨”has-a”æ¥è§£é‡Šç»„åˆï¼šç±»åž‹A䏿œ‰ä¸€ä¸ªç±»åž‹B的对象åšå±žæ€§ã€‚
- 基于原型的形å¼ä¹Ÿå¯è¢«ç§°ä¸ºç±»åž‹æ— 关的或基于实例的编程形å¼ï¼Œå®ƒæœ€å‡ºå的实现è¯è¨€èŽ«è¿‡äºŽjavascript。除了直接创建自身对象之外,它以其他对象作为原型通过克隆(clone)的方å¼é‡ç”¨å…¶ä»–对象的行为。通过对象得到新型对象,并在被调用时追溯原型对象ä¸çš„æ–¹æ³•,支æŒè¿™ç§ç¼–程方å¼çš„è¯è¨€ç‰¹æ€§æ˜¯å§”托(delegation)。
OOPæ ¸å¿ƒ
- å°è£…(encapsulation),它是能称为é¢å‘对象编程的最é‡è¦çš„特点,它将对象自有的属性和行为å°åœ¨ç±»åž‹ä¸ï¼Œé™åˆ¶å†…外的访问接å£ï¼Œåœ¨ä¸åŒç§ç±»çš„类型之间划清界线,明确了模型,ä¿è¯äº†æ•°æ®å®‰å…¨ã€‚
- 继承(inheritance),它实现了类型级别的抽象和代ç é‡ç”¨ã€‚
- 多æ€ï¼ˆpolymorphism),它为é¢å‘对象设计æä¾›äº†å……足的自由度。它能通过接å£çº§åˆ«çš„æŠ½è±¡ï¼Œåˆ©ç”¨ç±»åž‹åŒ¹é…和晚绑定,实现从多ç§è¡¨çް形å¼ä¸ä¸ºå¯¹è±¡æˆ–方法åšå‡ºé€‰æ‹©ã€‚
OOD原则
- å•一èŒè´£åŽŸåˆ™ï¼ˆsingle responsibility principle)。å°è£…的目的是将对象自身的行为é™åˆ¶åœ¨è‡ªèº«ç±»åž‹ä¸ï¼Œè€Œè¯¥åŽŸåˆ™è¿›ä¸€æ¥å¼ºè°ƒç±»åž‹åº”当专注,åªå› ä¸€ä¸ªå˜æ•°è€Œå˜åŒ–,所有的行为集åˆä½“åªåœ¨æ‰®æ¼”一个角色,承担å•一的èŒè´£ã€‚å¼•ç”³çš„ï¼Œå…¶ä¸æ‰€æœ‰çš„æ–¹æ³•也åªå„åšä¸€ä»¶äº‹ã€‚
- 开放å°é—原则(open-close principle)。对扩展开放,对修改å°é—。ç»å¸¸è€ƒè™‘的是现在如何设计æ‰èƒ½åœ¨æœªæ¥åšæ‰©å±•çš„åŒæ—¶ï¼Œèƒ½å°½é‡ä¸ä¿®æ”¹çŽ°æœ‰ç³»ç»Ÿçš„ä»£ç ,或能够将修改é™ä½Žåˆ°å°‘æ•°çš„å‡ ä¸ªåœ°æ–¹ã€‚
- Liskov替æ¢åŽŸåˆ™ï¼ˆLiskov substitution principleï¼‰ã€‚å®ƒè¦æ±‚所有å类的对象在代替其父类被使用时都ä¸ä¼šå¾—到错误的结果,这是在ä¿è¯ä»¥å¤šæ€æ–¹å¼ä½¿ç”¨æ—¶ä¸ä¼šå‡ºé”™ï¼›è‹¥è¯¥åŽŸåˆ™è¢«æ‰“ç ´ï¼Œé‚£ä¹ˆå¼€æ”¾å°é—原则多åŠä¹ŸåŒæ—¶è¢«æ‰“ç ´äº†ã€‚è¿™æ˜¯ä¸€ä¸ªæ¯”è¾ƒè‹›åˆ»çš„åŽŸåˆ™ï¼Œåç±»é‡å†™çˆ¶ç±»æ–¹æ³•似乎å˜å¾—ä¸å¯èƒ½äº†ï¼Œå¯æ˜¯ä»”细想想会å‘现,似乎当åˆå¯¹çˆ¶ç±»æŠ½è±¡å¾—还ä¸å¤Ÿå½»åº•。
- ä¾èµ–倒置原则(Dependency inversion principle)。高层模å—需è¦è°ƒç”¨ä½Žå±‚模å—的方法,但ä¸èƒ½ç›´æŽ¥ä¾èµ–,而是应让两者都ä¾èµ–于接å£ã€‚è¿™æ˜¯è¯¥åŽŸåˆ™çš„ç¬¬ä¸€å±‚æ„æ€ï¼Œå®ƒçš„åˆè¡·æ˜¯å¼ºè°ƒè¦é¢å‘接å£ç¼–ç¨‹ï¼Œè€Œä¸æ˜¯é¢å‘实现,达到é™ä½Žè€¦åˆçš„目的。这基本是对的,ä¸è¿‡æˆ‘觉得接å£è¢«è¿‡åˆ†å¼ºè°ƒäº†ï¼Œåº”该在未æ¥å¯èƒ½ä¼šæ‰©å±•的地方考虑接å£çš„使用,ä¸è¦è¿‡åº¦è®¾è®¡å¾’增代ç ã€‚è¯¥åŽŸåˆ™è¿˜æœ‰ç¬¬äºŒå±‚æ„æ€ï¼ŒæŠ½è±¡ä¸åº”ä¾èµ–于细节,细节应该ä¾èµ–äºŽæŠ½è±¡ï¼Œè¿™æ‰æ˜¯â€œå€’ç½®â€äºŒå—的本æ„ã€‚å› ä¸ºæˆ‘ä»¬å¾€å¾€æ˜¯ç”±ç®€å•åˆ°å¤æ‚,由å•一类型到多ç§ç±»åž‹åœ°åœ¨æ‰©å±•程åºï¼Œæ‰€ä»¥ä¸ºæœ‰å…±åŒç‰¹ç‚¹çš„ç±»åšæŠ½è±¡å¸¸æ˜¯åœ¨å·²æœ‰å®žçŽ°ç±»ä¹‹åŽå†³å®šçš„,这时è¦è€ƒè™‘抽象是å¦å½»åº•ã€æ˜¯å¦æœ‰å¯¹å®žçŽ°çš„ä¾èµ–。ä¸è¿‡æˆ‘觉得这ç§éšæœºåº”å˜çš„æŠ½è±¡æ‰‹æ³•问题ä¸å¤§ï¼Œå¤§å¯ä¸å¿…一开始就æ»ç£•接å£ï¼Œé‚£æ‰æ˜¯è¿‡åº¦è®¾è®¡äº†ï¼Œæ‹¥æŠ±å˜åŒ–䏿˜¯ç™½è¯´çš„。å¯ä»¥å®žçŽ°åˆ†æžä¸‹é—®é¢˜ï¼Œé€‰æ‹©åˆé€‚çš„è®¾è®¡æ¨¡å¼æ˜¯ä¸ªå¥½ä¸»æ„。
- 接å£éš”离原则(Interface segregation principle)。这个原则比较简å•,它针对的是过多的接å£é›†ä¸åœ¨ä¸€èµ·çš„问题。就åƒä¸ºç±»åˆ’分å•一的èŒè´£ä¸€æ ·ï¼Œä¹Ÿåº”为接å£è€ƒè™‘较å•一的分类,ä¸è¦å§æ‰€æœ‰æŽ¥å£æ–¹æ³•éƒ½å †åœ¨ä¸€ä¸ªæŽ¥å£ä¸ã€‚好处是客户å¯ä»¥æœ‰é€‰æ‹©åœ°å®žçŽ°ç‰¹å®šçš„æŽ¥å£ï¼Œè€Œä¸å®žçŽ°æ— å…³çš„ï¼Œå®žçŽ°è§£è€¦åˆã€‚
———————-
åŽé¢ä¸€ç¯‡æ–‡ç« ä¸å¯¹ç±»ç»§æ‰¿å’ŒLiskov替æ¢åŽŸåˆ™æœ‰æ›´å¤šè®¨è®º