資料**《大話設計模式》
# 面試受挫
class program(object):
def __init__(self):
pass
def getresult(self):
a = int(input("請輸入數字:\n>>> "))
c = input("請輸入運算子:\n>>> ")
b = int(input("請輸入另乙個數字:\n>>> "))
if c == "+":
r = a + b
elif c == "-":
r = a - b
elif c == "*":
r = a * b
else:
r = a / b
print("運算結果為: ", r)
class program(object):
def __init__(self):
pass
def getresult(self):
a = int(input("請輸入數字:\n>>> "))
c = input("請輸入運算子:\n>>> ")
b = int(input("請輸入另乙個數字:\n>>> "))
if c == "+":
r = a + b
elif c == "-":
r = a - b
elif c == "*":
r = a * b
else:
if b == 0:
print("除數不能為0,請重新輸入")
exit(0)
else:
r = a / b
print("運算結果為: ", r)
碰到問題就直覺地用計算機能夠理解的邏輯來描述和表達待解決的問題及求解過程.這其實是計算機的方式思考,這並沒有錯.但是這樣的思維卻使得我們的程式只為滿足實現當前的需求,程式不容易維護,不容易擴充套件,更不容易復用.從而達不到高質量**的要求.
要改需求,更改最初的想法的事件,才逐漸明白當中的道理.
開始通過封裝,繼承,多型把程式的耦合性降低,用設計模式使得程式更加的靈活,容易修改,並且易於復用.
複製,因為當你的**中重複的**多到一定程度,維護的時候,可能就是一場災難.越大的系統,這種方式帶來的問題越嚴重,程式設計有一原則,就是用盡可能的辦法去避免重複.想想看,有哪些是和控制台無關,而哪些只是和計算器有關的.
讓業務邏輯與介面邏輯分開,讓它們之間的耦合度下降.
operation運算類:
class operation(object):
@staticmethod
def getresult(numbera, op, numberb):
# 這裡就單個函式更簡單,但是還是用類來實現,
if op == "+":
return numbera + numberb
elif op == "-":
return numbera - numberb
elif op == "*":
return numbera * numberb
else:
return numbera / numberb
客服端**:
if __name__ == "__main__":
numbera = int(input("請輸入數字:\n>>> "))
op = input("請輸入運算子:\n>>> ") # 這裡略過對操作符的
numberb = int(input("請輸入另乙個數字:\n>>> "))
try:
print(operation(numbera, op, number b)
except zerodivisionerror:
return "除數不能為0"
a: 如何做到很靈活的可修改和可擴充套件?比如說增加乙個平方根運算,如何改?
b: 只需要修改operation
類就可以了,在switch中加乙個分支就行了.
a: 問題是你要加乙個平方根運算,卻需要讓加減乘除的運算都得來參與編譯.
b: 我應該把加減乘除等運算分離,修改其中乙個不影響另外的幾個,增加運算演算法也不影響其他**?
a: 如何用繼承和多型,你應該有感覺了.
operation運算類:
import abc
class operation(abc.abc):
def __init__(self, numbera, numberb):
self._numbera = numbera
self._numberb = numberb
@abc.abstractmethod
def getresult(self):
raise notimplementederror
class operationadd(operation):
def __init__(self, numbera, numberb):
super(operationadd, self).__init__(numbera, numberb)
def getresult(self):
return self._numbera + self._numberb
class operationsub(operation):
def __init__(self, numbera, numberb):
super(operationsub, self).__init__(numbera, numberb)
def getresult(self):
return self._numbera - self._numberb
class operationmul(operation):
def __init__(self, numbera, numberb):
super(operationmul, self).__init__(numbera, numberb)
def getresult(self):
return self._numberb * self._numbera
class operationdiv(operation):
def __init__(self, numbera, numberb):
super(operationdiv, self).__init__(numbera, numberb)
def getresult(self):
try:
return self._numbera / self._numberb
except zerodivisionerror:
return "除數不能為0"
b: 我如何讓計算器知道我希望用哪乙個演算法呢?
a: 你現在的問題就是如何去例項化物件的問題,到底要例項化誰,將來會不會增加例項化的物件,比如增加開根運算,這是很容易變化的地方,應該考慮用乙個單獨的類做這個創造例項的過程,這就是工廠.
簡單運算工廠類:
class operationfactory(object):
_select =
@staticmethod
def createoperation(op):
return operationfactory._select.get(op)
客服端**:
if __name__ == "__main__":
numbera = int(input("請輸入數字:\n>>> "))
op = input("請輸入運算子:\n>>> ") # 這裡略過對操作符的判斷
numberb = int(input("請輸入另乙個數字:\n>>> "))
opcls = operationfactory.createoperation(op)
operation = opcls(numbera, numberb)
print(operation.getresult())
a: 如果有一天我們需要更改加法運算,我們只需要改**?
b: 改operationadd就可以了.
a: 增加運算?
b: 只要增加相應的運運算元類就可以了.還要去修改運算類工廠,在switch中增加分支.
這幾個類的結構圖:
程式設計是一門技術,更是一門藝術,不能只滿足於寫完**執行結果正確就完事了,時常考慮如何讓**更加簡練,更加容易維護,容易擴充套件和復用,只有這樣才能真正提高.
工廠模式 簡單工廠
簡單工廠其實並不是乙個設計模式,反而比較像一種程式設計習慣。我個人的這樣總結簡單工廠 建立乙個類,封裝建立物件的 故事 現在我要開一家披薩店,叫bbk 必敗客 披薩,賣很多種披薩 芝士披薩 榴蓮披薩等等,我有乙個orderpizza string type 方法,根據客戶傳來的type來提供不同的披...
工廠模式 簡單工廠
工廠 處理建立物件的細節。目的 將例項化具體類的 從應用中抽離,或者封裝起來,可以避免干擾應用的其他部分。簡單工廠 簡單工廠其實不是乙個設計模式,反而像一種程式設計習慣。產品實現 desc 產品a public inte ce a class a1 implements a override pub...
簡單工廠模式,工廠模式,抽象工廠模式
三種模式看了一天,記錄下自己的理解 headfirst,比薩店為例 1,簡單工廠模式 乙個具體的工廠類 pizzafactory 乙個抽象的產品類pizza,可以派生出多個具體的產品類 客戶 pizzastore類 工廠類 pizzafactory類關聯產品類pizza,工廠生產出不同型別的pizz...