単一のオブジェクトが複数の変数よりも優先されますか?


8

タイトルに意味を込めるのはかなり大変でしたが、コードに入れるのは簡単です。

C ++

これは

int offset_x = 10;
int offset_y = 40;
...
element.move(offset_x, offset_y);

これよりも優先されますか?

Vector<int> offset(10, 40);
...
element.move(offset.x, offset.y);

(Vector std::vectorはとは異なり、2Dベクトルです。このクラスには、やのようにnormalize()、ここでは不要な多くのメソッドがあります。これscale()には、より基本的なPointクラスが必要ですか?)

JavaScript

これは

var offsetX = 10;
var offsetY = 40;
...
element.move(offsetX, offsetY);

これよりも優先されますか?

var offset = {x: 10, y: 40};
...
element.move(offset.x, offset.y);

回答:


12

私は最初のバリアントを使用して多くのレガシーコードを「継承」し、代わりにクラスPoint2DPoint3Dクラスを使用して多くのコードを自分で作成しました(本質的にはあなたVector<int>と同じです)。最初のバリアントは常に、パラメーターが多すぎて繰り返し構造が多すぎる関数につながり、単純なベクトル加算またはスカラー乗算が数行のコードで何度も繰り返されます。

ただし、2Dポイントクラスまたはベクタークラスを使用すると、特に多くのベクター操作が必要な場合に、コードがより簡潔で簡潔になり、読みやすく、保守しやすくなります。既存のを使用する必要がある場合Vector<int>、または独自のPointクラスを作成する必要がある場合は、コードの詳細を知らない限り、言うことは不可能ですが、一般的に、既存のクラスが必要である場合は、再利用しないのはなぜですか?あなたが典型的に必要としない追加の方法は害を与えません。しかし、ほとんどの場合 2Dポイント/ベクタークラスを使用しないのは間違った判断です。そして、上記の例では、element.move関数に影響がある場合、私見では、のelement.move(offset)代わりに呼び出すことができる方法で設計した方がよいでしょうelement.move(offset_x, offset_y)

たとえば、ポイント座標の配列が必要で、を使用するとしstd::vectorます。最初のケースでは、2つの std::vector<int>変数が必要です。これらの2つのベクトルが互いに「同期」していることを確認する必要があります。新しい要素の追加、既存の要素の検索、それらの要素の受け渡しには、代わりに2行のコードが必要です。std::vector<Point2D>代わりに使用することを選択したときの1つ。


3

より一般的な答えを与えるには、論理的に意味がある場合、変数をオブジェクトにグループ化する必要があります。

  • 変数は1つの「もの」の異なる側面または特性ですか?
  • 彼らはいつも一緒にいますか?
  • それらは、オブジェクトの作成に関連する可能性のある追加の作業を正当化するのに十分に使用されますか?

あなたの場合、変数を一緒にグループ化すると、コードが明らかに改善されると思います。

しかし、よく考えられていないオブジェクト内で変数が一緒にスラップされると、通常の変数を使用するよりも悪い扱いにくい設計に陥る可能性があります。

逆に、過剰設計することも可能です。「完全な」オブジェクト指向構造について考え、構築することに多くの時間を費やし、それが実際に物事を成し遂げるのを妨げるほどです。


1

実際には、これを行うのが最善の方法だと思います。

Vector<int> offset(10, 40);
element.moveBy(offset);

このコードはベクトルの次元を抽象化element.moveBy(offset)します。型が必要な操作を正しく実装している限り、ベクトルを3D、または倍、さらには極座標に変更しても、同じコード行()は変更されずに機能します。

たとえば、次のコードを考えてみます。

Vec wallBounce(Obj& o, cont Wall& w) {
    assert(isUnit(w.normal));
    Vec perp = dot(w.normal, o.velocity) * w.normal;
    o.velocity -= 2 * perp;
}

十分なベクトル数学の手がかりがあれば、誰でもここで何が起こるか理解できます。さらに、機能は短いですが、要点です。Vectypedefの対象を確認することはできませんが、通常はそれほど面白くなく、調べるのも簡単です。コードの明快さと簡潔さは、それを補う以上のものです。結局、コーディングはすべて抽象化を行うことであり、スカラーのグループをベクトルに抽象化することは非常に強力な抽象化です。キックについては、2Dベクトル、3Dベクトル、およびスカラーについて、この抽象化を行わずに上記の関数試して実装してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.