日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

[Python设计模式] 第1章 计算器——简单工厂模式

發(fā)布時(shí)間:2024/4/15 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Python设计模式] 第1章 计算器——简单工厂模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

github地址:https://github.com/cheesezh/python_design_patterns

寫在前面的話

""" 讀書的時(shí)候上過《設(shè)計(jì)模式》這一門課,當(dāng)時(shí)使用的教材是程杰老師的《大話設(shè)計(jì)模式》,使用的語言是C#,學(xué)過課程之后初期深感面向?qū)ο笏枷氲膫ゴ?#xff0c;但是很少應(yīng)用到實(shí)際開發(fā)中。后來我接觸了Python,現(xiàn)在工作中用到最多的也是Python,或許是因?yàn)镻ython的便利性,我寫的很多腳本/程序都還是面向過程編程,缺少面向?qū)ο蟮乃枷朐诶镞?。因?#xff0c;我打算重讀程杰老師的《大話設(shè)計(jì)模式》并用Python進(jìn)行實(shí)踐。""" by ZH奶酪——張賀

題目

用一種面向?qū)ο笳Z言實(shí)現(xiàn)一個(gè)計(jì)算器控制臺程序, 要求輸入兩個(gè)數(shù)和運(yùn)算符號(+-*/), 得到結(jié)果.

基礎(chǔ)版本

a = int(input("input a number:")) b = str(input("input a operater(+ - * /):")) c = int(input("input a number:"))if b == "+":print(a+c) elif b == "-":print(a-c) elif b == "*":print(a*c) else b == "/":print(a/c) input a number:16 input a operater(+ - * /):* input a number:2 32

點(diǎn)評

  • 變量命名不規(guī)范
  • 無用的if條件判斷太多
  • 除法運(yùn)算中未考慮第二個(gè)數(shù)字為0的情況
  • 改進(jìn)版本1.0——規(guī)范代碼

    number_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))if operator == "+":print(number_a + number_b) elif operator == "-":print(number_a - number_b) elif operator == "*":print(number_a * number_b) elif operator == "/":if number_b != 0:print(number_a / number_b)else:print("With operator '/', the second number can not be zero.") else:print("Wrong operator.") input a number:12 input a operater(+ - * /):/ input a number:0 With operator '/', the second number can not be zero.

    點(diǎn)評

  • 沒有使用面向?qū)ο蟮乃枷?/li>
  • 只滿足當(dāng)前需求, 不易維護(hù), 不易擴(kuò)展, 不易復(fù)用, 不夠靈活
  • 為什么活字印刷術(shù)能位列四大發(fā)明?主要是其方法的思想。

  • 文章改字方便, 可維護(hù)
  • 一個(gè)字可以重復(fù)使用, 可復(fù)用
  • 文章加字容易, 可擴(kuò)展
  • 文章改版只需移動(dòng)活字, 靈活性好
  • 復(fù)制?復(fù)用?

    如果做一個(gè)帶圖形化界面的計(jì)算器,上邊的代碼需要再寫一次。為了避免這樣,需要將業(yè)務(wù)邏輯與界面邏輯分開,降低耦合度。

    改進(jìn)版本2.0——利用封裝解耦

    class Operation():def __init__(self):self.result = Nonedef get_result(self, number_a, number_b, operator):if operator == "+":self.result = number_a + number_belif operator == "-":self.result = number_a - number_belif operator == "*":self.result = number_a * number_belif operator == "/":if number_b != 0:self.result = number_a / number_belse:print("With operator '/', the second number can not be zero.")else:print("Wrong operator.")return self.resultnumber_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))operation = Operation() print(operation.get_result(number_a, number_b, operator)) input a number:12 input a operater(+ - * /):+ input a number:12 24

    點(diǎn)評

  • 僅僅用到了封裝, 還沒用到繼承和多態(tài)。
  • 緊耦合?松耦合?

    如果要支持一個(gè)開根號運(yùn)算,上邊的代碼需要改動(dòng)包括加減乘除在內(nèi)的get_result函數(shù),應(yīng)該將加減乘除運(yùn)算分離, 修改其中一個(gè)不影響其他的幾個(gè)。那么就需要定義一個(gè)Operator基類, 將get_result定義為虛函數(shù),然后通過繼承和多態(tài),分別實(shí)現(xiàn)加減乘除四個(gè)子類,每個(gè)子類中定義虛函數(shù)的實(shí)現(xiàn)邏輯。

    參考資料: Python中的多態(tài)與虛函數(shù)

    改進(jìn)版本3.0——簡單工廠模式

    from abc import ABCMeta, abstractmethodclass Operation():__metaclass__ = ABCMetadef __init__(self):self.result = None@abstractmethoddef get_result(self):passclass AddOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a + number_breturn self.resultclass SubOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a - number_breturn self.resultclass MulOperation(Operation):def get_result(self, number_a, number_b):self.result = number_a * number_breturn self.resultclass DivOperation(Operation):def get_result(self, number_a, number_b):if number_b == 0:print("With operator '/', the second number can not be zero.")return self.resultself.result = number_a / number_breturn self.result

    如何實(shí)例化?——簡單工廠模式

    現(xiàn)在加減乘除的實(shí)現(xiàn)邏輯已經(jīng)進(jìn)一步隔離,之后即使增加一個(gè)開根號運(yùn)算符,也和加減乘除無關(guān)。那么如何去實(shí)例化這些類呢?可以用簡單工廠模式。

    class OperationFactory():@classmethoddef create_operate(self, operator):oper = Noneif operator == "+":oper = AddOperation()elif operator == "-":oper = SubOperation()elif operator == "*":oper = MulOperation()elif operator == "/":oper = DivOperation()else:print("Wrong operator.")return oper

    通過上邊的簡單工廠,輸入運(yùn)算符號,就可以實(shí)例化出對應(yīng)的對象。下邊是客戶端的代碼。

    number_a = int(input("input a number:")) operator = str(input("input a operater(+ - * /):")) number_b = int(input("input a number:"))oper = OperationFactory.create_operate(operator) print(oper.get_result(number_a, number_b)) input a number:12 input a operater(+ - * /):- input a number:12 0

    點(diǎn)評

  • 業(yè)務(wù)邏輯與界面邏輯隔離,不關(guān)心是控制臺程序還是GUI程序
  • 不同運(yùn)算邏輯隔離,一個(gè)運(yùn)算符的增刪改操作不會(huì)影響其他運(yùn)算
  • 面向?qū)ο笏枷氲姆庋b,繼承,多態(tài)都有所體現(xiàn)
  • 易維護(hù),易擴(kuò)展,易復(fù)用
  • 轉(zhuǎn)載于:https://www.cnblogs.com/CheeseZH/p/9363197.html

    總結(jié)

    以上是生活随笔為你收集整理的[Python设计模式] 第1章 计算器——简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。