Pythonでクラスを設計するにはどうすればいいですか? 質問する

Pythonでクラスを設計するにはどうすればいいですか? 質問する

以前の質問に対して本当に素晴らしい助けを頂きました足跡検出用そして足の中のつま先ただし、これらのソリューションは一度に 1 つの測定に対してのみ機能します。

今、データがあるそれは次のものから構成されます:

  • 約30匹の犬
  • それぞれ 24 個の測定値(複数のサブグループに分かれています)があります。
  • 各測定には少なくとも4つの接触(各足に1つ)があり、
    • 各コンタクトは5つの部分に分かれており、
    • 接触時間、場所、総力など、いくつかのパラメータがあります。

代替テキスト

すべてを 1 つの大きなオブジェクトに詰め込むのは明らかに不十分なので、現在の大量の関数の代わりにクラスを使用する必要があると考えました。しかし、Learning Python のクラスに関する章を読んだにもかかわらず、自分のコードに適用できませんでした (GitHubリンク

すべてのデータを処理するのはかなり奇妙だと感じています今度は、何らかの情報を取り出したいです。各足の位置がわかれば、これを再度計算する必要はありません。さらに、同じ犬のすべての足を比較して、どの接触がどの足 (前足/後足、左足/右足) に属するかを判断したいです。関数だけを使い続けると、混乱が生じます。

そこで、データを処理できるクラスを作成する方法についてアドバイスを求めています(1匹の犬の圧縮データへのリンク) を賢明な方法で実行します。

ベストアンサー1

クラスを設計する方法。

  1. 言葉を書き留めてください。あなたはこれを始めました。これをやらずに、なぜ問題が起こるのか疑問に思う人もいます。

  2. これらのオブジェクトが行うことについて、言葉の集合を簡単な記述に拡張します。つまり、これらのオブジェクトに対して行うさまざまな計算を書き留めます。30 匹の犬、24 の測定値、4 つの接触、および接触ごとにいくつかの「パラメーター」という短いリストは興味深いものですが、これはストーリーの一部にすぎません。「各足の位置」と「同じ犬のすべての足を比較して、どの接触がどの足に属しているかを判断する」は、オブジェクト設計の次のステップです。

  3. 名詞に下線を引きます。本当です。これの価値について議論する人もいますが、初めての OO 開発者にとっては役立つと思います。名詞に下線を引きます。

  4. 名詞を確認します。「パラメータ」や「測定」などの一般的な名詞は、問題領域の問題に当てはまる特定の具体的な名詞に置き換える必要があります。具体的な名詞は問題を明確にするのに役立ちます。一般的な名詞は単に詳細を省略するだけです。

  5. 各名詞 (「接触」、「足」、「犬」など) について、その名詞の属性と、そのオブジェクトが実行するアクションを書き留めます。省略しないでください。すべての属性。たとえば、「データ セットには 30 匹の犬が含まれています」は重要です。

  6. 各属性について、これが定義された名詞との関係なのか、それとも文字列や浮動小数点数などの他の種類の「プリミティブ」または「アトミック」データや、還元不可能な何かとの関係なのかを識別します。

  7. 各アクションまたは操作について、どの名詞が責任を持ち、どの名詞が単に関与するかを識別する必要があります。これは「可変性」の問題です。一部のオブジェクトは更新されますが、他のオブジェクトは更新されません。可変オブジェクトは、その変化に対して完全な責任を負う必要があります。

  8. この時点で、名詞をクラス定義に変換し始めることができます。集合名詞には、リスト、辞書、タプル、セット、または名前付きタプルなどがあり、それほど多くの作業は必要ありません。他のクラスは、複雑な派生データのため、または実行される更新/変更のために、より複雑になります。

unittest を使用して各クラスを個別にテストすることを忘れないでください。

また、クラスは必ず変更可能である必要があるという法則はありません。たとえば、あなたの場合、変更可能なデータはほとんどありません。あるのは、ソース データセットから変換関数によって作成された派生データです。

おすすめ記事