前書き
データを含むオブジェクトのセットがあり、これらのオブジェクトを操作する必要があるとします。
最も一般的な例は、バスケットに果物を入れることだとしましょう。フルーツを追加する特定のartクラスを実装します。次に、ボリュームパラメータを定義するために、基本クラスFruitが必要です。これに、フルーツに応じて値を割り当てます。問題は解決され、バスケットの容量がしきい値に達するまでフルーツが追加されます。
数回繰り返した後、バスケットを充填するためのプログラムで、腐ったナシやリンゴとワームなどがいくつか折りたたまれた場合、基本のフルーツクラスを拡張し、鮮度、純度などのパラメーターを追加します。検証条件が表示されます。
そして、これが問題の始まりです。はい、私たちのクラスはより用途が広くなりましたが、果物の問題の数が増えるだけでなく、果物狩り自体の状況も異なる可能性があります。たとえば、私たちは絶対にすべての果物が新鮮な果物を選びます。この場合、すべての果物が新鮮であることがわかっているのに、なぜ新鮮さを担当する分野が必要なのですか?必須およびオプションのタイプを示すために追加の機能を囲うには?- もちろん違います。いくつかのオプションの型を配列(辞書)に入れます。各型はクラスの直接の一部ではありません。私たちの機能は再びスマートになり、素晴らしいです。
しかし、私はさらに進んでこのトピックを少し発展させることにしました。
考え
オプションの変数を文字列形式で格納するタイプを定義します。実際、これは配列のラッパーです。最小限の情報セットとして、変数の名前、タイプ(basic、int、string、bool、またはいくつかの基本的なものの組み合わせのいずれか)および値を格納します。
このオブジェクトのメソッドは可変にすることができますが、私は自分自身のために次のことを強調しました。
変数とそのタイプのリストを文字列形式で取得します(通常、名前に制限することができます)。これは、オブジェクトを「原点」でマークする場合に役立ちます。
定数形式の変数に関する情報を含む配列を返すゲッター。
型のIDと変数の名前による値の取得(特定の型にキャストするために必要)。
class IVariable
{
public:
using Type = std::variant < int, double, bool, std::string>; //
virtual std::vector < std::pair < std::string_view, std::string_view > > abstract() = 0;
virtual std::vector < std::tuple < std::string_view, VarTypes, std::string_view > > released() = 0;
virtual std::pair < VarTypes, std::string_view > released(const std::string_view& name) = 0;
};
, , :
, "" , .
, ""
bool tryVector(const std::string_view& dX)
{
auto type = range.front()->released(dX);
if(type.first == VarTypes::_null)
{
return false;
}
for(auto&& var : _range)
{
if(var->released(dX).first != type.first)
{
return false;
}
}
return true;
}
, ( tryVector).
, , , .
, , .
状況に応じて、より多くのパラメーターが必要な場合、またはその逆の場合に、オブジェクトの操作範囲を調整する機能。
オブジェクトの設計方法ではなく、オブジェクトを使用して実行する必要のあるアクションについて考えてください。
短所
同じタイプの多数のオブジェクトの計算には適していません。たとえば、ピクセルのrgbコンポーネントを定義するクラスの場合、プロパティを明示的に定義する方が効率的です。
このようなアプローチは多くのメモリを消費するため、オブジェクトの操作にのみ使用するのが理にかなっています。オブジェクトの本質は、いくつかの単純な変数で表現することはできません。直接計算よりもオブジェクトの論理処理の方が重要です。