私は最近、switch-case ステートメントをサポートしている言語で使用しないことを推奨する質問を読みました。Python に関する限り、次のような多くのスイッチ ケースの置換を見てきました。
- 辞書の使用 (多くのバリアント)
- タプルの使用
- 関数デコレーターの使用 ( http://code.activestate.com/recipes/440499/ )
- ポリモーフィズムの使用 (型チェック オブジェクトの代わりに推奨される方法)
- if-elif-else はしごの使用
- 誰かが訪問者パターンを推奨しました(おそらく外因性)
さまざまなオプションがあるため、特定のコードに対して何をすべきかを判断するのに少し苦労しています。一般的に、これらの方法のいずれかを選択する基準を学びたいと思います。また、判断に迷った場合の具体的な対処法(選択肢の説明付き)を教えていただければ幸いです。
ここに特定の問題があります:
(1)
def _setCurrentCurve(self, curve):
if curve == "sine":
self.currentCurve = SineCurve(startAngle = 0, endAngle = 14,
lineColor = (0.0, 0.0, 0.0), expansionFactor = 1,
centerPos = (0.0, 0.0))
elif curve == "quadratic":
self.currentCurve = QuadraticCurve(lineColor = (0.0, 0.0, 0.0))
このメソッドは、メニューから曲線を描くことを選択したことに応答して、 qt-slotによって呼び出されます。上記の方法では、アプリケーションが完了すると合計 4 ~ 7 個の曲線が含まれます。この場合、使い捨ての辞書を使用することは正当化されますか? これを行う最も明白な方法は if-elif-else ですが、それを使用する必要がありますか? すべての曲線クラスが **kargs を使用しているため、ここで **kargs を使用することも検討しています (友人の助けを借りて)。
(2)
この 2 番目のコードは、ユーザーが曲線のプロパティを変更したときに呼び出されるqt-slotです。基本的に、スロットは gui (spinBox) からデータを取得し、適切なカーブ クラスのインスタンス変数に入れます。この場合、再び同じ質問があります - dict を使用する必要がありますか?
これが前述のスロットです-
def propertyChanged(self, name, value):
"""A Qt slot, to react to changes of SineCurve's properties."""
if name == "amplitude":
self.amplitude = value
elif name == "expansionFactor":
self.expansionFactor = value
elif name == "startAngle":
self.startAngle = value
elif name == "endAngle":
self.endAngle = value
参考までに、上記のスロットに接続するためのコードを次に示します -
def _connectToPage(self, page):
for connectionData in page.getConnectibles():
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
lambda value, name = connectionData["property"]:\
self.currentCurve.propertyChanged(name, value))
self.connect(connectionData["object"],
SIGNAL(connectionData["signal"]),
self.hackedDisplayArea.update)
注- self.endAngle などはコンストラクタで初期化されます。
私の知る限り、dict を選択する理由は高速検索のためです。それはいつ保証されますか?100件以上の場合は?関数が呼び出されるたびに辞書を作成して破棄し続けるのは良い考えですか? 関数の外でこの目的のために dict を構築する場合、他の場所で必要かどうかを確認する必要がありますか? 他の場所で必要ない場合はどうなりますか?
私の質問は、もしあればベストプラクティスは何ですか? 物事を進めるための最善/最もエレガントな方法は何ですか? さらに別の言い方をすると、if-elif-elseをいつ使用するか、他の各オプションをいつ使用するか?