2017-01-03 13 views
1

私はC#およびプログラミング全般に対してかなり新しいので、なぜこの質問をしていますか?構造体またはクラスをパラメータとして使用する

私は最近、同僚が自分のコードを見直しました。彼は次の方法では、いくつかのパラメータにクラスを使用する必要があると述べました。

public List<Items> DoSomething(List<OtherItems> someItems, int amountOfItems, 
    DbGeopgrahpy Location) 
{ //More stuff, irrelevant to the question. 

彼は私が代わりにそれらの値を含むことになり、クラスでamountOfItemsLocationを置くべきであると指摘しました。

このメソッドは、このデータをクライアントに返すコントローラから呼び出されます。

私の質問はです。なぜですか?私はそれが可読性を向上させることは理解しています(間違いなく)が、クラスとしてパラメータを使うことにはどんな利点がありますか?このメソッドを呼び出すたびにクラスを宣言しなければならない場合、これがパフォーマンスに悪影響を及ぼすことすら想定できます。

これは構造体がこのように使用できることがわかりました。これが良い習慣であれば、いつ構造体を使用すればいいですか?

+2

*なぜ*今、私の質問は - なぜあなたは彼に尋ねませんでしたか?既存のトピック「struct vs class」は数多くあります。 [ここ](http://stackoverflow.com/q/3942721/1997232)。 – Sinatr

+0

@Sinatrええ私は自分の間違いを認識しています、この人は現時点では会社にいませんので、もう質問はできません。また、私は構造体対クラスの使用について知っていますが、いつそれらをパラメータとして使うべきですか? – RandomStranger

+1

これらの2つのパラメータで構成される潜在的なクラス/構造体が、その呼び出しだけではなく、より多くの用途を持っているかどうか自問してください。あなたは、 "MyLovelyClassUsedToCallDoSomething"以外のそのようなクラスの意味のある名前を知っていますか?それを忘れないなら。 – Ralf

答えて

4

パラメータの収集ではなく、メソッドの引数としてDTOクラスを使用する利点の1つは、今後メソッドのシグネチャの変更を防止することです。これは、APIパブリックメソッド(たとえば、変更やメソッドのバージョニングを壊さずにAPIを変更できるようにするなど)に便利です。

メソッドを更新/修正する必要があり、追加の引数を渡す必要があるとします。あなたのメソッドが1つの引数(class/struct)しか期待していない場合、メソッドのシグネチャを変更する必要はありません。代わりに、DTOクラスに追加のプロパティを追加するだけです。

+0

ああ、意味があります。私は、この関数を呼びたい人がパラメータを読み込む代わりにクラス/構造体を探す必要があるので、混乱していると主に心配していました。 – RandomStranger

0

個人的には、3つまたは4つ以上のパラメータが論理的にグループ化されている(同じ種類のオブジェクトまたは情報に属している)場合は、クラスを使用します。

これはあなたが探しているように非常に任意です。それぞれの人は、クラス/構造体をいつ使用するかについて、独自のルールセットを持っています。

2

もっと意識していると思います。メソッドが別のオブジェクトにカプセル化できるパラメータが多すぎると予想される場合、それは良いオブジェクト定義を行っていない可能性があることを示しています。また、あなたのソフトウェアが成長し始めると、クラス内のすべてをグループ化するほうがずっと優れているので、あなたとあなたと一緒に働く人々は、そう簡単に見つけることができます。

//avoid 
public void Checkout(string shippingName, string shippingCity, 
     string shippingSate, string shippingZip, string billingName, 
     string billingCity, string billingSate, string billingZip) 
{ 

} 

//DO 
public void Checkout(ShippingAddress shippingAddress,BillingAddress billingAddress) 
{ 
} 

ご覧のとおり、共通プロパティはグループ化された共通のクラスにグループ化されています。あなたは基準を適用し、良いグループ分けをしなければなりません。

+0

しかし、メソッドを呼び出すたびにクラスを作成するのはもっと紛らわしいことではありませんか?また、パフォーマンスに悪影響を及ぼしませんか? – RandomStranger

+0

いいえ、毎回ではありません。誤解しないでください。おそらく同じオブジェクトに応答する可能性のあるパラメータをグループ化することができます。ポイントを見ることができるように例を追加します。 – NicoRiff

+0

これは主に読みやすくしたい場合や、パラメータを再利用したいときです。 – RandomStranger

関連する問題