《重構》讀書筆記(二) 第一章 第乙個重構案例

2021-06-15 11:23:39 字數 3446 閱讀 5270

作者在第一章通過乙個影片出租的例子,試圖闡述重構的基本過程和步驟。看得出來,作者對這個案例給予厚望,花了很大的篇幅。正因如此,我沒有理由不好好學習這一章。

影片出租的例子本身不難,但我足足花了一整個下午學習了這個例子。我先是老老實實的把**用c++重抄了一遍,然後跟著作者的步伐,一步步重構,以期體驗「重構改善設計」的完美過程。

這三個晚上儘管進展緩慢,但收穫不少:

一,體驗了重構改善設計的過程。

二,對state/strategy有了更進一步的理解。

三,第一次嘗試使用了qtestlib對**進行單元測試,儘管還有很多需要學習,但至少開始了。

四,關於我在開始閱讀這本書時的乙個疑問?我怎麼樣開發出我的軟體功能?

這裡作者給出了答案: 我們應該學會在「重構這頂帽子」和「新增新功能這頂帽子」之間來回切換。當然,你要時刻知道自己戴的是哪一頂帽子!

記住作者的幾句忠告:

1. 任何乙個傻瓜都能寫出計算機可以理解的**。唯有寫出人類容易理解的**,才是優秀的程式設計師。

2. 更改變數名稱是值得的行為嗎?絕對值得!!

3. 重構過程中,**可讀性 > 效能。只有在優化時,我們才需要考慮效能。

**:

#ifndef customer_h

#define customer_h

#include #include #include "rental.h"

// 顧客類

class customer

;#endif // customer_h

#include "customer.h"

customer::customer(const qstring &name)

: m_name(name)

void customer::apendrental(const rental &rental)

qstring customer::getname() const

qstring customer::statement() const

;#endif // movie_h

#include "movie.h"

movie::movie(const qstring &title, int pricecode)

: m_title(title), m_pricecode(pricecode)

void movie::settitle(const qstring &title)

qstring movie::gettitle() const

void movie::setpricecode(int pricecode)

int movie::getpricecode() const

double movie::getcharge(int daysrented) const

return thisamount;

}int movie::getfreqrenterpoints(int daysrented) const

else

}

重構至strategy模式:

#ifndef movie_h

#define movie_h

#include class pricestrategy;

// 影片類

class movie

;#endif // movie_h

#include "movie.h"

#include "pricestrategy.h"

movie::movie(const qstring &title, int pricecode)

: m_title(title)

void movie::settitle(const qstring &title)

qstring movie::gettitle() const

void movie::setpricecode(int pricecode)

}int movie::getpricecode() const

double movie::getcharge(int daysrented) const

int movie::getfreqrenterpoints(int daysrented) const

策略類**檔案:

#ifndef pricestrategy_h

#define pricestrategy_h

class pricestrategy

;class regularpricestrategy : public pricestrategy

virtual int getpricecode() const;

virtual double getcharge(int daysrented) const;

};class childrenpricestrategy : public pricestrategy

virtual int getpricecode() const;

virtual double getcharge(int daysrented) const;

};class newreleasepricestrategy : public pricestrategy

virtual int getpricecode() const;

virtual double getcharge(int daysrented) const;

virtual int getfreqrenterpoints(int daysrented) const;

};#endif // pricestrategy_h

#include "pricestrategy.h"

#include "movie.h"

pricestrategy::pricestrategy()

int pricestrategy::getfreqrenterpoints(int daysrented) const

int regularpricestrategy::getpricecode() const

double regularpricestrategy::getcharge(int daysrented) const

int childrenpricestrategy::getpricecode() const

double childrenpricestrategy::getcharge(int daysrented) const

int newreleasepricestrategy::getpricecode() const

double newreleasepricestrategy::getcharge(int daysrented) const

int newreleasepricestrategy::getfreqrenterpoints(int daysrented) const

重構第一章 重構的第乙個案例

這一章通過講解租碟的案例來初步解釋了重構的意義,有些問題何老師已經講過了,比如說變數命名,分割 等等 1.1 起點 如果你發現自己需要為程式新增乙個特性,而 結構使你無法很方便地那麼做,那就先重構那個程式,使特性的新增比較容易進行,然後再新增特性。1.2 重構的第一步 測試 每當我要進行重構的時候,...

第一章 重構,第乙個案例 讀書筆記系列1

1.1起點 這是乙個影片出租店用的程式,計算每一位顧客的消費金額並列印報表statement 操作者告訴程式 顧客租了哪些影片,租期多長,程式便根據租賃時間和影片型別出費用 影片有三類 兒童片,普通片,新片 除了計算費用,還要為常客計算點數,點數會隨著 租片種類是否為新片 而有所不同 以下是 的確如...

第一章讀書筆記

本章內容主要講的是android系統移植和驅動開發概述,通過本章的學習知道了學習linux驅動程式設計一定要了解linux驅動只與linux核心有關,與客戶的使用的linux系統無關。也就是說,不管是那個linux系統,只要使用了同樣的linux核心,驅動就可以通過。唯一可以判斷的linux核心是否...