怎樣寫好一個類

「代碼大全」一書談到了抽象數據模型(ADT)的概念,以PHP的角度來看,日常最多見的類就是抽象數據模型的表現形式,不少人對面向對象編程還處在懵懵懂懂的階段,常常什麼方法都塞在一個類中,舉個例子,咱們有個字體的類,代碼以下:php

<?php
class Font
{
    public $style; // 字體樣式

    public function getStyle()
    {
        // code ..
    }

    public function createDiv()
    {
        // code ..
    }

    public function insertFontToDiv()
    {
        // code ..
    }
}

這個類中定義了公有的屬性"style",獲取Style的方法和另一些子方法,原本建立這個類是爲了圍繞「字體」做文章的,但在實現過程當中,臨時需求的增長使得這個類中多了Div和把字體插入到Div的方法,這是很常見的狀況,而這只是個開始,與類無關的代碼會愈來愈多,就像地上本無垃圾,有人丟了第一塊垃圾,人們就會跟着丟垃圾同樣,最後的結果就是這個類變得不易維護,可讀性減低,致使這樣的緣由就是與類無關的代碼破壞了這個類抽象的一致性。程序員

另外這個類的style屬性也有問題,它的類型是public,意味着外部能夠隨時調用改寫,而後外部代碼就有了編程

$font = new Font;
$font->style = 'font-size: 13px';

或者:字體

$font = new Font;
$font->style = 'font-weight: both';

等等等等,日積月累,某一天,產品走到你面前,微微一笑地對你說:陳工啊,麻煩給每一個字體都加上個默認的14px字體大小樣式;code

你一臉懵逼帶着生無可戀的表情望着產品(他或者她或者它):……好,請你給我半天或更長的時間來改;對象

產品:#¥%……&*(&……%#¥%……&*;get

你一邊查找替換着代碼,一邊暗罵本身爲何不在Font類中定義個方法來調用style屬性,一邊還總結着經驗告訴本身下次毫不這麼傻逼了。程序員老是在一次次的慘痛經驗中進步着,但若是有那麼一本好書籍或者好導師,真的會少走不少彎路。(再給代碼大全打個廣告)產品

第一段咱們講到抽象的概念,抽象是什麼呢?面向對象中有個原則既單一原則,我理解的抽象跟這個單一原則有着千絲萬縷的關係;單一原則分爲類的單一和方法的單一,好比說,人有吃喝拉撒四種行爲,他們即有類的單一原則(人),也有方法的單一原則(吃、喝、拉、撒),這裏的「人」就是咱們抽象出來的東西,若是你往裏面加個飛行的行爲,就破壞了類的單一原則和抽象性,來驗證下,加入飛行行爲以後人就有了「吃、喝、拉、撒、飛行」五個行爲,這不是人應該是鳥了。io

「高內聚、低耦合」是寫好類的核心思想,抽象(單一性)能幫助咱們寫出低耦合的代碼,那高內聚呢,內聚性會直接表如今咱們的代碼維護上,當咱們寫出內聚性很強的代碼時,與之關聯的維護工做也會變得簡單。上面的栗子講到這個程序員把style屬性設爲public而且在外部代碼中直接修改致使了後面的問題產生;對這些易改變的元素咱們應該經過子程序(方法)修改的方式來加強它們的維護性,把全部的變化都控制在類中來加強類的內聚性。面向對象編程

一切理論都是虛的,實踐纔是讓本身進步的最佳方法,Talk is cheap. Show me the code。

相關文章
相關標籤/搜索