なぜパターンのPythonを設計していませんか?

上記の「クリックして開発者向け技術最前線を」、「スター」を選択

愛の13時21分見て


著者:劉新|編集者:ココア|ソース:コード農家がターンオーバー


640?wx_fmt = JPEG



 
  

遠くの王国のPythonでは、ティーンエイジャーがあり、プログラミングについて非常に情熱的で、彼の両親は、後に友人の普遍的な円を聞いて、彼にクラスを与えたかったし、我々はすべてのギルとして知られている、同じ先生をお勧めしますことを見出しました。 


だから、彼の両親は、午後に週6日は、子どもたちが学ぶことができるように、授業料のためのお金の合計を支払うことを躊躇しませんでした。 


青年はすぐにPythonの構文、ツールとフレームワークを学んだ、非常に難しい学びます。 


教師だけでなく、コードの権利を書くために彼に言う、刻まれたヒスイ、財布を参照してください、だけでなく、コードはかなり、エレガントな、読みやすい、保守性にするようなことがあります。 


ティーンエイジャーは、教師が必要な基準を達成するために独自のコードをしようと、ユニットテスト、TDD、リファクタリングに学習しています。 


彼の壁に掲示彼はまた、「Pythonの禅」、多くの場合、独自のコードを制御違反を敢行することはありません。 


ティム・ピーターズのPythonの禅、 


美しいは醜いよりも優れています。 

明示的、暗黙よりも優れています。 

シンプルは、複雑なよりも優れています。 

コンプレックスは複雑よりも優れています。 

フラットは、ネストされたよりも優れています。 

スパースは密よりも優れています。 

可読性がカウントされます。 

......


三年後、少年は、実際には、大きなプロジェクトは、ビジネスは非常に複雑であり、一日、彼のために大きな仕事を配置し、教師になるまで、彼は、Pythonのマスターになったと思いました。


夜を通してティーンエイジャーのプログラミングが、彼は悲劇的に彼はコードですいかに難しいか、彼がしようと、どんなに混乱であることを発見し、何の美しさがありません、彼は、ハイブリッドモジュール群をクラスを書きました。 


だから、彼は先生に尋ねる行かなければならなかった:「先生、私のPythonとフラスコフレームワークは、心によって使用されている、なぜこのプロジェクトを完了しませんか?」 


先生は言った:「あなただけでインポートするためのフレームワークの種類に必要なので、私の子供は、今、あなたは自分自身の要約を作るために、独自のクラスを設計する必要があり、コードの行に少し何かを書きます!」 


 「どのようにそれを設計するには?」 


「先生があなたに古代の本を送っているように、」デザインモード「は、あなたが戻って、それを見てください。」


640?wx_fmt = PNG


ティーンエイジャーの宝、黄ばん古い本に、20年前に眠れぬ夜をこれを勉強し、または説明C ++を使用しています。  


彼は霧見、理解するように見えた、彼らは私が先生に尋ねる行かなければならなかった、理解していないようです。 


今回は、先生は彼に別の本、「ヘッドファーストデザインパターン」を与えました 


640?wx_fmt = PNG


ティーンエイジャーが見えるようになって、この本はJavaで書かれたので、別のJava言語は、それらを急落されます。 


この本は夢中にティーンエイジャーを見て、理解することは比較的容易です。 


最後に、彼は自信を持ってのPythonとその大きなプロジェクトを開始します。 


彼はいくつかの問題を解決するために設計されたPython言語のデザインパターンを、実現が、常に間違っていると感じ、およびJava、C ++は奇妙な感じに比較しました。 


彼らは再建をいつでもまた、彼は常に、開始することを恐れ、不快な場所動的言語を感じ、彼は混乱して先生に言いました。 


先生は微笑んで言った:「Javaで私の王国、人々はいつも言う 『動的モーメントを冷却、再構築された火葬場』、今、あなたはそれを理解するために来て!」 


「Javaはこの問題を避けることができるのだろうか?」  


「Javaは静的型付け言語であることが復興のための支援の種類は非常に良好で決定されると、変数を変更することができない、あなたが見るためには興味を持っていない?など春、春ブーツ、MyBatisの、ダボ、ネッティー、などのフレームワークがたくさんあります非常に繁栄して開発しました。」 


先生は彼にノートを書き、それがJavaの王国に来るときIO大臣を見つけ、彼に言うように、憧れの少年感覚は、すべてがスムーズになります。  


少年別れの先生、厳粛に、東ジャワ帝国の方向を見て、先生が服を着てまっすぐに、Javaの帝国を実行し、三回お辞儀:「五年には、IOの大人は、私はあなたの信頼に住んでいないが、まただまさそれを行うためのJavaの男!」  


これは、教師がギーセンにあることが判明します! IO大臣は、宣教師は王国Pythonで自宅軟禁下に、透けて見えるために不幸に入った後、ジャワの文化や価値観を広める送りました。 


会場のギーセンの物語」のJava帝国の侵入Pythonは成功することができますか?"  


Pythonは何のインタフェースではありませんか?


王は不安感につながる、国内政策の変更があったかどうかを知りませんが、Javaの王国に向けた若者が多い最近言った、記念のPythonの境界線を受け取りました。 


猛烈な王Pythonは、徹底的な調査を命じました。どこへ行くの調査、すべての手がかりは、一人の人を指す:ギーセン。 


この日、Pythonの特使が、それは彼がちらつきの若い男だったことが判明した、兵士ギーセンの住居に付属しています。 


特使怒りは笑った:「あなたはPythonが中途半端学び、実際に人々を混乱させるためにあえて、それはばかげています。」 


ギーセン自身の狡猾は非常に穏やかまだを通して見てきた:「あなたの名誉の誤解、私が教える本物のオブジェクト指向設計とデザインパターンである、ああ、Pythonで実装され、このデザインパターンは、それは非常に厄介ですが、私は学ぶためにそれらをお勧めしますJavaのああ。」  


「ナンセンス、厄介であることをどのようにPythonのデザインパターンを書くのか?Java構文を伴う限られた能力に比較的弱い表現するために、いくつかの質問は、私たちPythonの構文レベルを解決するために不器用なデザインパターンを使用していた、問題を解決することができます!」 


「そして、デザインパターンの原則が何であるか、教えて?」ギーセン尋ねました。 


継承されたのではなく、1インターフェースにプログラミングではなく、プログラム指向実装.2優先組合せ。」特使ライブすることは困難です。


 「Pythonの接続ポートは、どのようにインターフェイス指向プログラミングではありません?」ギーセンは尋ねました。 


特使は笑った:「あなたはそれが中途半端であると言う、あなたはまだ不満、あなたはインターフェイスは、あなたがここにあああなたがPythonのダックタイピングを忘れJavaインタフェースであると思いますか!?」 


class Duck:    def fly(self):        print("Duck flying")class Airplane:    def fly(self):        print("Airplane flying")def lift_off(entity):    entity.fly()duck = Duck()plane = Airplane()lift_off(duck)lift_off(plane)
    def fly(self):
        print("Duck flying")

class Airplane:
    def fly(self):
        print("Airplane flying")


def lift_off(entity):
    entity.fly()


duck = Duck()
plane = Airplane()

lift_off(duck)
lift_off(plane)


「あなたはアナロジーに持っている場合は、no、アヒルや飛行機はあなたがインターフェイスを呼び出しますが、()メソッドを飛ぶ呼び出すことができるものを達成していない参照してください、このない指向のプログラミング・インタフェースは、これはフライで自動化インターフェースああ。」 


ギーセンは本当に代わりに、優先度継承の組み合わせを使用しての、それぞれがオブジェクト指向言語を達成することができることが、彼はため息をついて、質問しないことがあり、第2の原理として、このレベルを期待していませんでした。 


アダプタモード


特使は言うようになった:「ダックタイピングは非常に強力ですが、あなたはダックタイピングの前でデザインパターンを言及していない、多くのデザインパターン私はあなたの例を与える純粋に余分、アダプタモデルは、クライアントがそのようなコードを持っていることを前提としてい.. 缶それらに書かれたログファイルの期間。」 


 
  
def log(file,msg):    file.write('[{}] - {}'.format(datetime.now(), msg))
    file.write('[{}] - {}'.format(datetime.now(), msg))


「今、新たな需要は、データベースにログインする必要がありますが、データベースには、どうすればよいですか?そして、書き、それをアダプタ方法書き込めません。」 


 
  
class DBAdapter:    def __init__(self, db):        self.db = db    def write(self, msg):        self.db.insert(msg)
    def __init__(self, db):
        self.db = db

    def write(self, msg):
        self.db.insert(msg)


「これはどんなDBAdapterは(私は大きなPythonのインターフェイスを持っていない)インターフェースを実装して必要としないことに注意してくださいはちょうどそれへの書き込み方法を有することは、別のクラスです。」 


 
  
db_adapter = DBAdapter(db)log(db_adapter, "sev1 error occurred")"sev1 error occurred")


限り、あなたは任意のオブジェクトであるかどうか、書き込み方法は、典型的なダックタイピング呼び出すことができるよう、実際には非常に簡単です。   


それは顧客が利用できるように、そのプロキシパターンは、プロキシクラスとプロキシクラスのメソッド限り、似ているので、アダプターを書き込むことができますので。 


しかし、この方法の欠点は、私は、ログパラメータ法の種類を知っていないということです、あなたが再構築したいことは困難です。 


シングルトン


ギーセンも特使に挑戦し続け、問題を考えた:「?Pythonのも、プライベートキーワードは、クラスのコンストラクタを非表示にする方法を、どのように単一のケースを達成するためではない」を 


特使の軽蔑と言った:「多くの方法があるPythonでシングルトンを書きたかった、それのJavaの思考のセットは忘れて、私はあなたのPython、達成するための方法のモジュールを比較する方法を示しています。」


 
  
#singleton.pyclass Singleton:    def __init__(self):        self.name = "i'm singleton"instance = Singleton()del Singleton  # 把构造函数删除

class Singleton:
    def __init__(self):
        self.name = "i'm singleton"

instance = Singleton()

del Singleton  # 把构造函数删除


シングルトンを使用します。


 
  
import singletonprint(singleton.instance.name)  # i'm singletoninstance = Singleton() # NameError: name 'Singleton' is not defined

print(singleton.instance.name)  # i'm singleton

instance = Singleton() # NameError: name 'Singleton' is not defined


ギーセンは、このようなアプローチ、隠された情報を達成するためのPythonモジュールを使用することを期待していませんでした。


ビジターモード


必ずしもすべてのデザインパターンは右、それを行うことができますか?ギーセンは、自分自身に考えて、彼はモードを理解することは困難ポップ:ビジターは、自分自身がそれを学ばなければならなかったが、ドラッジで。 


ギーセンは言った:「そして、Pythonの機能を使用する方法、ビジターのために、私に教えて?」 


「私が何であったか、あなたが本当に意味を知って、私はクラスを記述して、ビジターのアクセスにそれを書くこと以上のものを望んでいない、それはないですか?」 


 
  
class TreeNode:    def __init__(self, data):        self.data = data        self.left = None        self.right = None    def accept(self, visitor):        if self.left is not None:            self.left.accept(visitor)        visitor.visit(self)        if self.right is not None:            self.right.accept(visitor)class PrintVisitor:    def visit(self,node):        print(node.data)root = TreeNode('1')root.left = TreeNode('2')root.right = TreeNode('3')visitor = PrintVisitor()root.accept(visitor)   #输出2, 1, 3
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
    def accept(self, visitor):
        if self.left is not None:
            self.left.accept(visitor)

        visitor.visit(self)

        if self.right is not None:
            self.right.accept(visitor)

class PrintVisitor:
    def visit(self,node):
        print(node.data)

root = TreeNode('1')
root.left = TreeNode('2')
root.right = TreeNode('3')

visitor = PrintVisitor()

root.accept(visitor)   #输出2, 1, 3


ギーセンは言った:「はいああ、Visitorパターンは非常にそれを書くされていないのですか?」


「私はあなたがPythonはちょうどそれの表面に傷を学んだと述べ、エッセンスビジター分離構造と操作で、Pythonで発電機の使用は、よりエレガントに達成することが可能です。」 


 
  
class TreeNode:    def __iter__(self):        return self.__generator()    def __generator(self):        if self.left is not None:            yield from iter(self.left)         yield from self.data        if self.right is not None:            yield from iter(self.right) root = TreeNode('1')root.left = TreeNode('2')root.right = TreeNode('3')for ele in root:    print(ele)

    def __iter__(self):
        return self.__generator()

    def __generator(self):
        if self.left is not None:
            yield from iter(self.left) 
        yield from self.data

        if self.right is not None:
            yield from iter(self.right) 

root = TreeNode('1')
root.left = TreeNode('2')
root.right = TreeNode('3')

for ele in root:
    print(ele)


分離の構造と動作の目的を達成しながら認めざるを得ない、このアプローチは、使用する方が簡単です。 


特使は言う:参照してください「、Python言語レベルモードはとても私の大きなPythonでデザインパターンの多くは非常に不器用に見える、いくつかのサポートを提供するには、私たちがここで提唱していない、もちろん、我々はまだ、オブジェクト指向設計と固体の原則を習得しなければなりません出てくるエレガントなプログラムを書くように、パッケージの変更や変化を検出し、デザインパターンを考えます。」 


ギーセンは戦わず、レジストをもはや、彼自身Xueyibujingを感じない、ため息をつきました。 


終了


ギーセンのPythonの裁判の王国は、死に彼を宣告するつもりだったが、Java帝国は重くの釈放を求め、または戦争に行くために、到着しました。 


ギーセンは、人々の目には英雄になった、バックのJava王国に送られた、彼は慎重にそれを達成するためPython言語のJavaやPython、Java仮想マシンに家を比較しました!彼の英雄的行為の認識は王であるJythonと呼ばれるこの言語。640?wx_fmt = JPEG


。します。https://www.youtube.com/watchのV = G5OeYHCJuv0 Psのこの記事は、このビデオの話に触発されたのですか?


終わり

開発者向け技術最前線は、テクノロジー業界の動向や前線のニュースレターの懸念、呉服メーカーを結集し、優れたガイドの開発者の経験と成長です。

読み込み歴史


Pythonの3.8リリース、新機能の総合的な解釈

Pythonの学習ルートマインドマップ、古典的なコレクション!

GoogleのPythonのコーディング標準

640? 640?wx_fmt = GIF 640?wx_fmt = PNG 格好良い、右の点のような 640?wx_fmt = GIF


おすすめ

転載: blog.csdn.net/DevolperFront/article/details/90628505