名詞、動詞、形容詞を書き出すことは素晴らしいアプローチですが、どのデータを非表示にするべきかという質問をするようにクラス設計を考えるのが好きです。です。
あなたがQuery
オブジェクトとDatabase
オブジェクトを:
このQuery
オブジェクトは、クエリの作成と保存に役立ちます。ここでは、保存が重要です。関数を使用すると、クエリを簡単に作成できます。多分あなたはとどまることができます:Query().select('Country').from_table('User').where('Country == "Brazil"')
。構文は厳密には関係ありません-それがあなたの仕事です!-重要なのは、オブジェクトが何かを隠すのに役立つことです。この場合、クエリの保存と出力に必要なデータです。オブジェクトの威力は、それを使用する構文(この場合は巧妙な連鎖)にあり、オブジェクトを機能させるために何が格納されているかを知る必要がないことにあります。正しく行われた場合Query
オブジェクトは複数のデータベースのクエリを出力できます。内部的には特定の形式を格納しますが、出力時に他の形式(Postgres、MySQL、MongoDB)に簡単に変換できます。
次にDatabase
オブジェクトについて考えてみましょう。これは何を隠して保存しますか?データベースがあるので、データベースの完全なコンテンツを保存することはできません。だからポイントは何ですか?目標は、オブジェクトを使用するユーザーからデータベースの動作を隠すDatabase
ことです。良いクラスは、内部状態を操作するときの推論を単純化します。このためDatabase
オブジェクトでは、ネットワーク呼び出しの動作を非表示にしたり、クエリや更新をバッチ処理したり、キャッシュレイヤーを提供したりできます。
問題はこれです Database
オブジェクトが巨大であることです。これはデータベースへのアクセス方法を表すため、内部では何でもすべてを実行できます。システムによっては、ネットワーキング、キャッシング、およびバッチ処理を処理するのが非常に難しいので、それらを非表示にすると非常に役立ちます。しかし、多くの人々が気づくように、データベースはめちゃくちゃ複雑であり、生のDB呼び出しから離れれば離れるほど、パフォーマンスを調整し、物事がどのように機能するかを理解することが難しくなります。
これはOOPの基本的なトレードオフです。適切な抽象化を選択すると、コーディングが簡単になります(文字列、配列、辞書)。大きすぎる抽象化(データベース、EmailManager、NetworkingManager)を選択すると、複雑すぎて、それがどのように機能するか、または何をすべきかを理解できなくなる場合があります。期待する。目標は複雑さを隠すことですが、ある程度の複雑さが必要です。経験則としては、Manager
オブジェクトを回避することから始めて、代わりに、structs
データを保持するだけのようなクラスを作成します。データを作成/操作するヘルパーメソッドを使用して、作業を簡単にします。たとえば、オブジェクトを取得するEmailManager
呼び出された関数で開始sendEmail
するEmail
場合。これは単純な出発点であり、コードは非常に理解しやすいものです。
あなたの例として、あなたが探しているものを計算するためにどのようなデータが一緒になる必要があるかを考えてください。たとえば、動物がどこまで歩いているかを知りたい場合はAnimalStep
、およびAnimalTrip
(AnimalStepsのコレクション)クラスを持つことができます。各トリップにすべてのステップデータが含まれるようになったので、それについて何かを理解できるはずAnimalTrip.calculateDistance()
です。