0

私は自分のクラス API の一部について考えていましたが、思いついたのは次のようなものでした: 等しい属性のタプル/リストを使用する必要があるか、それとも複数の属性を使用する必要があるか、たとえば、Controller複数の温度計を読み取るクラスがあるとします。

class Controller(object):
    def __init__(self):
        self.temperature1 = Thermometer()
        self.temperature3 = Thermometer()
        self.temperature2 = Thermometer()
        self.temperature4 = Thermometer()

対。

class Controller(object):
    def __init__(self):
        self.temperature = tuple(Thermometer() for _ in range(4))

どのスタイルを使用するべきか、ベスト プラクティスはありますか?

(温度計の数が変更されないと仮定しましょう。それ以外の場合は、リストを使用して 2 番目のスタイルを選択することは明らかです。)

4

2 に答える 2

4

タプルまたはリスト、100%。variable1variable2、など... は、非常に一般的なアンチパターンです。

後でどのようにコーディングするかを考えてください。おそらく、これらの項目と同様のことをしたいと思うでしょう。データ構造では、それらをループして操作を実行できますが、番号付きの変数名を使用すると、手動で行う必要があります。それだけでなく、より多くの値を簡単に追加できるようになり、コードがより一般的になり、再利用しやすくなり、実行中に新しい値を簡単に追加できるようになります。

数値が変わらないと仮定するのはなぜですか? 多くの場合、そのような仮定は間違っています。いずれにせよ、2 番目の例は、明快で効率的なコードの中心となるdo not repeat yourselfの慣用句を例示していることはすでにお分かりいただけたと思います。

cpu_temperature、 など、より関連性の高い名前があったとしてもhdd_temperature、それらに対して同じ操作を実行しているのを見たことがあれば、多くの変数ではなく、データ構造が必要です。この場合、辞書:

temperatures = {
    "cpu": ...,
    "hdd": ...,
    ...
}

主なことは、データをデータ構造に格納することで、提供するグループ化に関する情報をソフトウェアに提供することです。それらに変数名を与えるだけでは、プログラマーに伝えているだけであり、それらに番号が付けられている場合、プログラマーにそれらが何であるかを実際に伝えていません。

于 2012-11-04T13:02:45.570 に答える
0

別のオプションは、それらを辞書として保存することです。

{1: temp1, 2: temp2}

データを格納する方法を決定する際に最も重要なことは、データの意味を中継することです。これらの項目が、わずかに異なるコンテキストで本質的に同じ情報である場合は、それを中継するために (データ型に関して) グループ化する必要があります。タプルまたは辞書として保存されます。

注: タプルを使用し、後で追加のデータを挿入する場合、たとえばtemp0最初に a を挿入すると、個々の変数を取得した場所で下位互換性の問題が発生する可能性があります。(辞書temp[1]を使用すると、常に が返されtemp1ます。)

于 2012-11-04T13:05:50.423 に答える