欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在 PHP 中養成 7 個(gè)面向對象的好習慣
如果您尚未打算用 OO 原則創(chuàng )建應用程序,則使用 PHP 的面向對象(OO)的語(yǔ)言特性,這 7 個(gè)習慣將幫助您開(kāi)始在過(guò)程編程與 OO 編程之間進(jìn)行轉換。

在 PHP 編程早期,PHP 代碼在本質(zhì)上是限于面向過(guò)程的。過(guò)程代碼 的特征在于使用過(guò)程構建應用程序塊。過(guò)程通過(guò)允許過(guò)程之間的調用提供某種程度的重用。

但是,沒(méi)有面向對象的語(yǔ)言構造,程序員仍然可以把 OO 特性引入到 PHP 代碼中。這樣做有點(diǎn)困難并且會(huì )使代碼難于閱讀,因為它是混合范例(含有偽 OO 設計的過(guò)程語(yǔ)言)。使用 PHP 代碼中的 OO 構造 — 例如能夠定義和使用類(lèi)、能夠構建使用繼承的類(lèi)之間的關(guān)系以及能夠定義接口 — 可以更輕松地構建符合優(yōu)秀 OO 實(shí)踐的代碼。

雖然沒(méi)有過(guò)多模塊化的純過(guò)程設計運行得很好,但是 OO 設計的優(yōu)點(diǎn)表現在維護上。由于典型應用程序的大部分生命周期都花費在維護上,因此代碼維護是應用程序生命周期的重要部分。并且在開(kāi)發(fā)過(guò)程中代碼維護很容易被遺忘。如果在應用程序開(kāi)發(fā)和部署方面存在競爭,那么長(cháng)期可維護性可能被放在比較次要的地位。

模塊化 — 優(yōu)秀 OO 設計的主要特性之一 — 可以幫助完成這樣的維護。模塊化將幫助封裝更改,這樣可以隨著(zhù)時(shí)間的推移更輕松地擴展和修改應用程序。

總的來(lái)說(shuō),雖然構建 OO 軟件的習慣不止 7 個(gè),但是遵循這里的 7 個(gè)習慣可以使代碼符合基本 OO 設計標準。它們將為您提供更牢固的基礎,在此基礎之上建立更多 OO 習慣并構建可輕松維護與擴展的軟件。這些習慣針對模塊化的幾個(gè)主要特性。有關(guān)獨立于語(yǔ)言的 OO 設計優(yōu)點(diǎn)的更多信息,請參閱 參考資料。

7 個(gè)優(yōu)秀 PHP OO 習慣包括:

  1. 保持謙虛。
  2. 做個(gè)好鄰居。
  3. 避免看到美杜莎。
  4. 利用最弱的鏈接。
  5. 您是橡皮;我是膠水。
  6. 限制傳播。
  7. 考慮使用模式。

保持謙虛

保持謙虛指避免在類(lèi)實(shí)現和函數實(shí)現中暴露自己。隱藏您的信息是一項基本習慣。如果不能養成隱藏實(shí)現細節的習慣,那么將很難養成任何其他習慣。信息隱藏也稱(chēng)為封裝。

直接公開(kāi)公共字段是一個(gè)壞習慣的原因有很多,最重要的原因是讓您在實(shí)現更改中沒(méi)有應有的選擇。使用 OO 概念隔離更改,而封裝在確保所作更改在本質(zhì)上不是病毒性(viral)更改方面扮演不可或缺的角色。病毒性 更改是開(kāi)始時(shí)很小的更改 — 如將保存三個(gè)元素的數組更改為一個(gè)只包含兩個(gè)元素的數組。突然,您發(fā)現需要更改越來(lái)越多的代碼以適應本應十分微不足道的更改。

開(kāi)始隱藏信息的一種簡(jiǎn)單方法是保持字段私有并且用公共訪(fǎng)問(wèn)方法公開(kāi)這些字段,就像家中的窗戶(hù)一樣。并沒(méi)有讓整面墻都朝外部開(kāi)放,而只打開(kāi)一兩扇窗戶(hù)(我將在 “好習慣:使用公共訪(fǎng)問(wèn)方法” 中介紹訪(fǎng)問(wèn)方法的更多信息)。

除了允許您的實(shí)現隱藏在更改之后外,使用公共訪(fǎng)問(wèn)方法而非直接公開(kāi)字段將允許您在基本實(shí)現的基礎上進(jìn)行構建,方法為覆蓋訪(fǎng)問(wèn)方法的實(shí)現以執行略微不同于父方法的行為。它還允許您構建一個(gè)抽象實(shí)現,從而使實(shí)際實(shí)現委托給覆蓋基本實(shí)現的類(lèi)。

壞習慣:公開(kāi)公共字段

在清單 1 的壞代碼示例中,Person 對象的字段被直接公開(kāi)為公共字段而非使用訪(fǎng)問(wèn)方法。雖然此行為十分誘人,尤其對于輕量級數據對象來(lái)說(shuō)更是如此,但是它將對您提出限制。


清單 1. 公開(kāi)公共字段的壞習慣
<?php
class Person
{
public $prefix;
public $givenName;
public $familyName;
public $suffix;
}

$person = new Person();
$person->prefix = "Mr.";
$person->givenName = "John";

echo($person->prefix);
echo($person->givenName);

?>

如果對象有任何更改,則使用該對象的所有代碼也都需要更改。例如,如果某人的教名、姓氏和其他名字被封裝到 PersonName 對象中,則需要修改所有代碼以適應更改。

好習慣:使用公共訪(fǎng)問(wèn)方法

通過(guò)使用優(yōu)秀的 OO 習慣(參見(jiàn)清單 2),同一個(gè)對象現在擁有私有字段而非公共字段,并且通過(guò)稱(chēng)為訪(fǎng)問(wèn)方法getset 公共方法謹慎地向外界公開(kāi)私有字段。這些訪(fǎng)問(wèn)方法現在提供了一種從 PHP 類(lèi)中獲取信息的公共方法,這樣在實(shí)現發(fā)生更改時(shí),更改使用類(lèi)的所有代碼的需求很可能變小。


清單 2. 使用公共訪(fǎng)問(wèn)方法的好習慣
<?php
class Person
{
private $prefix;
private $givenName;
private $familyName;
private $suffix;

public function setPrefix($prefix)
{
$this->prefix = $prefix;
}

public function getPrefix()
{
return $this->prefix;
}

public function setGivenName($gn)
{
$this->givenName = $gn;
}

public function getGivenName()
{
return $this->givenName;
}

public function setFamilyName($fn)
{
$this->familyName = $fn;
}

public function getFamilyName()
{
return $this->familyName;
}

public function setSuffix($suffix)
{
$this->suffix = $suffix;
}

public function getSuffix()
{
return $suffix;
}

}

$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");

echo($person->getPrefix());
echo($person->getGivenName());

?>

乍看之下,這段代碼可能會(huì )完成大量工作,并且實(shí)際上可能更多是在前端的工作。但是,通常,使用優(yōu)秀的 OO 習慣從長(cháng)遠來(lái)看十分劃算,因為將極大地鞏固未來(lái)更改。

在清單 3 中所示的代碼版本中,我已經(jīng)更改了內部實(shí)現以使用名稱(chēng)部件的關(guān)聯(lián)數組。比較理想的情況是,我希望擁有錯誤處理并且更仔細地檢查元素是否存在,但是本例的目的在于展示使用我的類(lèi)的代碼無(wú)需更改的程度 — 代碼并沒(méi)有察覺(jué)到類(lèi)發(fā)生更改。記住采用 OO 習慣的原因是要謹慎封裝更改,這樣代碼將更具有可擴展性并且更容易維護。


清單 3. 使用不同內部實(shí)現的另一個(gè)示例
<?php
class Person
{
private $personName = array();

public function setPrefix($prefix)
{
$this->personName['prefix'] = $prefix;
}

public function getPrefix()
{
return $this->personName['prefix'];
}

public function setGivenName($gn)
{
$this->personName['givenName'] = $gn;
}

public function getGivenName()
{
return $this->personName['givenName'];
}

/* etc... */
}

/*
* Even though the internal implementation changed, the code here stays exactly
* the same. The change has been encapsulated only to the Person class.
*/
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");

echo($person->getPrefix());
echo($person->getGivenName());

?>







做個(gè)好鄰居

在構建類(lèi)時(shí),它應當正確地處理自己的錯誤。如果該類(lèi)不知道如何處理錯誤,則應當以其調用者理解的格式封裝這些錯誤。此外,避免返回空對象或者狀態(tài)無(wú)效的對象。許多時(shí)候,只需通過(guò)檢驗參數并拋出特定異常說(shuō)明提供參數無(wú)效的原因就可以實(shí)現這一點(diǎn)。在您養成這個(gè)習慣時(shí),它可以幫您 — 和維護代碼或使用對象的人員 — 節省很多時(shí)間。

壞習慣:不處理錯誤

考慮清單 4 中所示的示例,該示例將接受一些參數并返回填充了一些值的 Person 對象。但是,在 parsePersonName() 方法中,沒(méi)有驗證提供的 $val 變量是否為空、是否是零長(cháng)度字符串或者字符串是否使用無(wú)法解析的格式。parsePersonName() 方法不返回 Person 對象,但是返回 null。使用這種方法的管理員或程序員可能會(huì )覺(jué)得很麻煩 — 至少他們現在需要開(kāi)始設置斷點(diǎn)并調試 PHP 腳本。


清單 4. 不拋出或處理錯誤的壞習慣
class PersonUtils
{
public static function parsePersonName($format, $val)
{
if (strpos(",", $val) > 0) {
$person = new Person();
$parts = split(",", $val); // Assume the value is last, first
$person->setGivenName($parts[1]);
$person->setFamilyName($parts[0]);
}
return $person;
}
}

清單 4 中的 parsePersonName() 方法可以修改為在 if 條件外部初始化 Person 對象,確??偸谦@得有效的 Person 對象。但是,您得到的是沒(méi)有 set 屬性的 Person,這仍然沒(méi)有很好地改善您的困境。

好習慣:每個(gè)模塊都處理自己的錯誤

不要讓調用方憑空猜測,而是對參數進(jìn)行預先驗證。如果未設置的變量無(wú)法生成有效的結果,請檢查變量并拋出 InvalidArgumentException。如果字符串不能為空或者必須為特定格式,請檢查格式并拋出異常。清單 5 解釋了如何在演示一些基本驗證的 parsePerson() 方法中創(chuàng )建異常以及一些新條件。


清單 5. 拋出錯誤的好習慣
<?php
class InvalidPersonNameFormatException extends LogicException {}


class PersonUtils
{
public static function parsePersonName($format, $val)
{
if (! $format) {
throw new InvalidPersonNameFormatException("Invalid PersonName format.");
}

if ((! isset($val)) || strlen($val) == 0) {
throw new InvalidArgumentException("Must supply a non-null value to parse.");
}


}
}
?>

最終目的是希望人們能夠使用您的類(lèi),而不必了解其中的工作原理。如果他們使用的方法不正確或者不是按照期望的方法使用,也不需要猜測不能工作的原因。作為一個(gè)好鄰居,您需要知道對您的類(lèi)進(jìn)行重用的人并沒(méi)有特異功能,因此您需要解決猜測的問(wèn)題。







避免看到美杜莎

在我最初了解 OO 概念時(shí),我十分懷疑接口是否真正有幫助。我的同事給我打了個(gè)比方,說(shuō)不使用接口就好像看到美杜莎的頭。在希臘神話(huà)中,美杜莎是長(cháng)著(zhù)蛇發(fā)的女怪。凡是看了她一眼的人都會(huì )變成石頭。殺死美杜莎的珀爾休斯通過(guò)在盾上觀(guān)察她的影子,避免了變成石頭而得以與她對抗。

接口就是對付美杜莎的鏡子。當您使用一個(gè)特定的具體實(shí)現時(shí),代碼也必須隨著(zhù)實(shí)現代碼的更改而更改。直接使用實(shí)現將限制您的選擇,因為您已經(jīng)在本質(zhì)上把類(lèi)變成了 “石頭”。

壞習慣:不使用接口

清單 6 顯示了從數據庫中裝入 Person 對象的示例。它將獲取人員的姓名并返回數據庫中匹配的 Person 對象。


清單 6. 不使用接口的壞習慣
<?php
class DBPersonProvider
{
public function getPerson($givenName, $familyName)
{
/* go to the database, get the person... */
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");
return $person;
}
}

/* I need to get person data... */
$provider = new DBPersonProvider();
$person = $provider->getPerson("John", "Doe");

echo($person->getPrefix());
echo($person->getGivenName());

?>

在環(huán)境發(fā)生更改之前,從數據庫中裝入 Person 的代碼都可以正常運行。例如,從數據庫裝入 Person 可能適用于第一個(gè)版本的應用程序,但是對于第二個(gè)版本,可能需要添加從 Web 服務(wù)裝入人員的功能。其實(shí),該類(lèi)已經(jīng)變成 “石頭”,因為它在直接使用實(shí)現類(lèi)并且現在能做的更改十分有限。

好習慣:使用接口

清單 7 顯示了一個(gè)代碼示例,在實(shí)現了加載用戶(hù)的新方法后并沒(méi)有進(jìn)行更改。該示例顯示了一個(gè)名為 PersonProvider 的接口,該接口將聲明單個(gè)方法。如果任何代碼使用 PersonProvider,代碼都禁止直接使用實(shí)現類(lèi)。相反,它就像是一個(gè)實(shí)際對象一樣使用 PersonProvider。


清單 7. 使用接口的好習慣
<?php
interface PersonProvider
{
public function getPerson($givenName, $familyName);
}

class DBPersonProvider implements PersonProvider
{
public function getPerson($givenName, $familyName)
{
/* pretend to go to the database, get the person... */
$person = new Person();
$person->setPrefix("Mr.");
$person->setGivenName("John");
return $person;
}
}

class PersonProviderFactory
{
public static function createProvider($type)
{
if ($type == 'database')
{
return new DBPersonProvider();
} else {
return new NullProvider();
}
}
}

$config = 'database';
/* I need to get person data... */
$provider = PersonProviderFactory::createProvider($config);
$person = $provider->getPerson("John", "Doe");

echo($person->getPrefix());
echo($person->getGivenName());
?>

在使用接口時(shí),嘗試避免直接引用實(shí)現類(lèi)。相反,使用對象外部的內容可以提供正確的實(shí)現。如果您的類(lèi)將裝入基于某些邏輯的實(shí)現,它仍然需要獲取所有實(shí)現類(lèi)的定義,并且那樣做也無(wú)法取得任何效果。

您可以使用 Factory 模式來(lái)創(chuàng )建實(shí)現接口的實(shí)現類(lèi)的實(shí)例。根據約定,factory 方法將以 create 為開(kāi)頭并返回接口。它可以為您的 factory 獲取必要的參數以計算出應當返回哪個(gè)實(shí)現類(lèi)。

在清單 7 中,createProvider() 方法只是獲取 $type。如果 $type 被設為 database,工廠(chǎng)將返回 DBPersonProvider 的實(shí)例。從數據庫中裝入人員的任何新實(shí)現都不要求在使用工廠(chǎng)和接口的類(lèi)中進(jìn)行任何更改。DBPersonProvider 將實(shí)現 PersonProvider 接口并且擁有 getPerson() 方法的實(shí)際實(shí)現。







利用最弱的鏈接

將模塊松散耦合 在一起是件好事情;它是允許您封裝更改的屬性之一。另外兩個(gè)習慣 — “保持謹慎” 和 “避免看到美杜莎” — 可幫助您構建松散耦合的模塊。要實(shí)現松散耦合的類(lèi),可通過(guò)養成降低類(lèi)依賴(lài)關(guān)系的習慣實(shí)現。

壞習慣:緊密耦合

在清單 8 中,降低依賴(lài)關(guān)系并不是必須降低使用對象的客戶(hù)機的依賴(lài)關(guān)系。相反,該示例將演示如何降低與正確類(lèi)的依賴(lài)關(guān)系并最小化這種依賴(lài)關(guān)系。


清單 8. Address 中緊密耦合的壞習慣
<?php

require_once "./AddressFormatters.php";

class Address
{
private $addressLine1;
private $addressLine2;
private $city;
private $state; // or province...
private $postalCode;
private $country;

public function setAddressLine1($line1)
{
$this->addressLine1 = $line1;
}

/* accessors, etc... */

public function getCountry()
{
return $this->country;
}

public function format($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter->format($this->getAddressLine1(),
$this->getAddressLine2(),
$this->getCity(), $this->getState(), $this->getPostalCode(),
$this->getCountry());
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo($addr->format("multiline"));
echo("n");

echo($addr->format("inline"));
echo("n");

?>

Address 對象上調用 format() 方法的代碼可能看上去很棒 — 這段代碼所做的是使用 Address 類(lèi),調用 format() 并完成。相反,Address 類(lèi)就沒(méi)那么幸運。它需要了解用于正確格式化的各種格式化方法,這可能使 Address 對象無(wú)法被其他人很好地重用,尤其是在其他人沒(méi)有興趣在 format() 方法中使用格式化方法類(lèi)的情況下。雖然使用 Address 的代碼沒(méi)有許多依賴(lài)關(guān)系,但是 Address 類(lèi)卻有大量代碼,而它可能只是一個(gè)簡(jiǎn)單的數據對象。

Address 類(lèi)與知道如何格式化 Address 對象的實(shí)現類(lèi)緊密耦合。

好習慣:在對象之間松散耦合

在構建優(yōu)秀的 OO 設計時(shí),必須考慮稱(chēng)為關(guān)注點(diǎn)分離(Separation of Concerns,SoC)的概念。SoC 指嘗試通過(guò)真正關(guān)注的內容分離對象,從而降低耦合度。在最初的 Address 類(lèi)中,它必須關(guān)注如何進(jìn)行格式化。這可能不是優(yōu)秀的設計。然而,Address 類(lèi)應當考慮 Address 的各部分,而某種格式化方法應當關(guān)注如何正確格式化地址。

在清單 9 中,格式化地址的代碼被移到接口、實(shí)現類(lèi)和工廠(chǎng)中 — 養成 “使用接口” 的習慣?,F在,AddressFormatUtils 類(lèi)負責創(chuàng )建格式化方法并格式化 Address。任何其他對象現在都可以使用 Address 而不必擔心要求獲得格式化方法的定義。

清單 9. 在對象之間松散耦合的好習慣
<?php

interface AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country);
}

class MultiLineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%sn%sn%s, %s %sn%s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class InlineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%s %s, %s, %s %s %s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class AddressFormatUtils
{
public static function formatAddress($type, $address)
{
$formatter = AddressFormatUtils::createAddressFormatter($type);

return $formatter->format($address->getAddressLine1(),
$address->getAddressLine2(),
$address->getCity(), $address->getState(),
$address->getPostalCode(),
$address->getCountry());
}

private static function createAddressFormatter($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter;
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo(AddressFormatUtils::formatAddress("multiline", $addr));
echo("n");

echo(AddressFormatUtils::formatAddress("inline", $addr));
echo("n");
?>

當然,缺點(diǎn)是只要使用模式,通常就意味著(zhù)工件(類(lèi)、文件)的數量會(huì )增加。但是,通過(guò)減少每個(gè)類(lèi)中的維護可以彌補這個(gè)缺點(diǎn),甚至在獲得正確的可重用性時(shí)反而可以減少工件量。







您是橡皮;我是膠水

具有高度內聚力的 OO 設計被集中并組織到相關(guān)模塊中。了解 “關(guān)注點(diǎn)” 對于決定如何緊密地聯(lián)系函數和類(lèi)十分重要。

壞習慣:降低內聚力

當設計的內聚力較低 時(shí),它就不能良好地組織類(lèi)和方法。意大利面條式代碼(spaghetti code)一詞通常用于描述捆綁在一起并且具有低內聚力的類(lèi)和方法。清單 10 提供了意大利面條式代碼的示例。相對通用的 Utils 類(lèi)將使用許多不同對象并且有許多依賴(lài)關(guān)系。它執行很多操作,因而很難實(shí)現重用。


清單 10. 降低內聚力的壞習慣
<?php

class Utils
{
public static function formatAddress($formatType, $address1,
$address2, $city, $state)
{
return "some address string";
}

public static function formatPersonName($formatType, $givenName,
$familyName)
{
return "some person name";
}

public static function parseAddress($formatType, $val)
{
// real implementation would set values, etc...
return new Address();
}

public static function parseTelephoneNumber($formatType, $val)
{
// real implementation would set values, etc...
return new TelephoneNumber();
}
}

?>

好習慣:利用高內聚力

高內聚力 指將相互關(guān)聯(lián)的類(lèi)和方法分組在一起。如果方法和類(lèi)都具有高度的內聚力,則可以輕松地分解整個(gè)組而不影響設計。具有高內聚力的設計將提供降低耦合的機會(huì )。清單 11 顯示了被較好組織到類(lèi)中的兩個(gè)方法。AddressUtils 類(lèi)將包含用于處理 Address 類(lèi)的方法,顯示了與地址相關(guān)的方法之間的高度內聚力。同樣地,PersonUtils 將包含專(zhuān)門(mén)處理 Person 對象的方法。這兩個(gè)擁有高度內聚力方法的新類(lèi)的耦合性都很低,因為可以完全獨立地使用。


清單 11. 高內聚力的好習慣
<?php

class AddressUtils
{
public static function formatAddress($formatType, $address1,
$address2, $city, $state)
{
return "some address string";
}

public static function parseAddress($formatType, $val)
{
// real implementation would set values, etc...
return new Address();
}

}

class PersonUtils
{
public static function formatPersonName($formatType, $givenName,
$familyName)
{
return "some person name";
}

public static function parsePersonName($formatType, $val)
{
// real implementation would set values, etc...
return new PersonName();
}
}

?>







限制傳播

我經(jīng)常對我所在的軟件團隊(我在其中擔任技術(shù)主管或架構師)的成員提起,OO 語(yǔ)言最大的敵人是復制和粘貼操作。當在缺少預先 OO 設計的情況下使用時(shí),沒(méi)有任何操作會(huì )像在類(lèi)之間復制代碼那樣具有破壞性。無(wú)論何時(shí),如果想將代碼從一個(gè)類(lèi)復制到下一個(gè)類(lèi)中,請停下來(lái)并考慮如何使用類(lèi)層次結構利用類(lèi)似功能或相同功能。在大多數情況下,使用優(yōu)秀設計后,您將會(huì )發(fā)現完全沒(méi)有必要復制代碼。

壞習慣:不使用類(lèi)層次結構

清單 12 顯示了部分類(lèi)的簡(jiǎn)單示例。它們從重復的字段和方法開(kāi)始 — 從長(cháng)遠來(lái)看,不利于應用程序作出更改。如果 Person 類(lèi)中有缺陷,則 Employee 類(lèi)中也很可能有一個(gè)缺陷,因為看上去似乎實(shí)現是在兩個(gè)類(lèi)之間復制的。


清單 12. 不使用層次結構的壞習慣
<?php
class Person
{
private $givenName;
private $familyName;
}

class Employee
{
private $givenName;
private $familyName;
}

?>

繼承 是一個(gè)很難入手的習慣,因為構建正確繼承模型的分析通常需要花費大量時(shí)間。反過(guò)來(lái),使用 Ctrl+C 組合鍵和 Ctrl+V 組合鍵構建新實(shí)現只需幾秒鐘。但是省下的這部分時(shí)間通常會(huì )在維護階段迅速抵銷(xiāo)掉,因為應用程序實(shí)際上將花費大量進(jìn)行維護。

好習慣:利用繼承

在清單 13 中,新 Employee 類(lèi)將擴展 Person 類(lèi)。它現在將繼承所有通用方法并且不重新實(shí)現這些方法。此外,清單 13 顯示了抽象方法的用法,演示如何將基本功能放入基類(lèi)中以及如何阻止實(shí)現類(lèi)使用特定函數。


清單 13. 利用繼承的好習慣
<?php
abstract class Person
{
private $givenName;
private $familyName;

public function setGivenName($gn)
{
$this->givenName = $gn;
}

public function getGivenName()
{
return $this->givenName;
}

public function setFamilyName($fn)
{
$this->familyName = $fn;
}

public function getFamilyName()
{
return $this->familyName;
}

public function sayHello()
{
echo("Hello, I am ");
$this->introduceSelf();
}

abstract public function introduceSelf();

}

class Employee extends Person
{
private $role;

public function setRole($r)
{
$this->role = $r;
}

public function getRole()
{
return $this->role;
}

public function introduceSelf()
{
echo($this->getRole() . " " . $this->getGivenName() . " " .
$this->getFamilyName());
}
}
?>







考慮使用模式

設計模式指對象和方法的常見(jiàn)交互,并且時(shí)間證明它可以解決某些問(wèn)題。當您考慮使用設計模式時(shí),您就需要了解類(lèi)之間如何進(jìn)行交互。它是構建類(lèi)及其交互操作的簡(jiǎn)單方法,無(wú)需重蹈他人的覆轍,并從經(jīng)過(guò)證明的設計中獲益。

壞習慣:一次考慮一個(gè)對象

實(shí)際上沒(méi)有適當的代碼示例可以演示如何考慮使用模式(盡管有豐富的優(yōu)秀示例可以顯示模式實(shí)現)。但是,一般而言,您知道在滿(mǎn)足以下條件時(shí)一次只能考慮一個(gè)對象:

  • 不會(huì )提前設計對象模型。
  • 開(kāi)始編寫(xiě)單一方法的實(shí)現,而無(wú)需去掉大部分模型。
  • 在交談中不使用設計模式名而寧愿談?wù)搶?shí)現。

好習慣:同時(shí)添加模式中形成的對象

一般而言,當您在執行以下操作時(shí)就是在考慮使用模式:

  • 提前構建類(lèi)及其交互操作。
  • 根據模式套用類(lèi)。
  • 使用模式名,如 Factory、SingletonFacade。
  • 去掉大部分模型,然后開(kāi)始添加實(shí)現。






結束語(yǔ)

在 PHP 中養成良好的 OO 習慣將幫助您構建更穩定、更易于維護和更易于擴展的應用程序。記?。?/p>

  • 保持謹慎。
  • 做個(gè)好鄰居。
  • 避免看到美杜莎。
  • 利用最弱的鏈接。
  • 您是橡皮,我是膠水。
  • 限制傳播。
  • 考慮使用模式。

當您養成并應用這些習慣后,您很可能會(huì )驚訝地發(fā)現應用程序在質(zhì)量上的飛躍。



參考資料

學(xué)習

獲得產(chǎn)品和技術(shù)
  • 使用 IBM 試用軟件,改進(jìn)您的下一個(gè)開(kāi)發(fā)項目,這些軟件可以通過(guò)下載或從 DVD 中獲得。

  • 下載 IBM 產(chǎn)品評估版 并開(kāi)始使用來(lái)自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的應用程序開(kāi)發(fā)工具和中間件產(chǎn)品。


討論


關(guān)于作者


Nathan Good 居住在明尼蘇達州的雙子城。其專(zhuān)職工作是軟件開(kāi)發(fā)、軟件架構和系統管理。在不編寫(xiě)軟件時(shí),他喜歡組裝 PC 和服務(wù)器、閱讀和撰寫(xiě)技術(shù)文章,鼓勵他的所有朋友轉用開(kāi)源軟件。他自己編著(zhù)以及與他人合著(zhù)了很多書(shū)籍和文章,包括 Professional Red Hat Enterprise Linux 3, Regular Expression Recipes: A Problem-Solution ApproachFoundations of PEAR: Rapid PHP Development。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
全面理解面向對象的 JavaScript
您不知道的 5 件事……: 多線(xiàn)程編程
使用 Android 和 XML 構建動(dòng)態(tài)用戶(hù)界面
PHP編程的五個(gè)良好習慣
「軟件考古學(xué)家」要如何應對遺留代碼?
使用 jQuery,第 1 部分: 將桌面應用程序引入瀏覽器
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久