7

複素数クラスを設計およびコーディングするOOPコースの割り当てを完了しました。追加のクレジットについては、次のことができます。

  1. 2つの複素数を追加します。この関数は、1つの複素数オブジェクトをパラメーターとして受け取り、複素数オブジェクトを返します。2つの複素数を加算すると、呼び出し元オブジェクトの実数部がパラメーターとして渡された複素数オブジェクトの実数部に追加され、呼び出し元オブジェクトの虚数部がとして渡された複素数オブジェクトの虚数部に追加されます。パラメータ。

  2. 2つの複素数を引きます。この関数は、1つの複素数オブジェクトをパラメーターとして受け取り、複素数オブジェクトを返します。2つの複素数を減算する場合、パラメーターとして渡された複素数オブジェクトの実数部が呼び出し元オブジェクトの実数部から減算され、パラメーターとして渡された複素数オブジェクトの虚数部がオブジェクトを呼び出しています。

これをコーディングしました。thisキーワードを使用してクラスの現在のインスタンスを示しました。addメソッドのコードは以下のとおりです。subtractメソッドは次のようになります。

 public ComplexNumber Add(ComplexNumber c)
{
    double realPartAdder = c.GetRealPart();
    double complexPartAdder = c.GetComplexPart();

    double realPartCaller = this.GetRealPart();
    double complexPartCaller = this.GetComplexPart();

    double finalRealPart = realPartCaller + realPartAdder;
    double finalComplexPart = complexPartCaller + complexPartAdder;

    ComplexNumber summedComplex = new ComplexNumber(finalRealPart, finalComplexPart);

    return summedComplex;
}

私の質問は:私はこれを正しくそして良いスタイルで行いましたか?(このキーワードを使用して)?

4

11 に答える 11

19

キーワードの使用についてはthis議論することができますが、それは通常、個人的な好みに要約されます。この場合、技術的な観点からは冗長ですが、個人的にはわかりやすくなると思いますので、それも使用します。

于 2009-12-04T08:20:09.100 に答える
6

冗長性の使用は、 StyleCopツールthis. で具体化されているMicrosoftコーディング標準によって推奨されています。

于 2009-12-04T08:24:52.663 に答える
6

次のように、数学演算子をオーバーロードすることもできます。

public static ComplexNumber operator +(ComplexNumber c1, ComplexNumber c2)
于 2009-12-04T08:26:59.050 に答える
3

あなたは今C#を学び、スタイルについて質問しているので、投稿したコードの間違っている点と理由をいくつか紹介します。

編集:あなたが実際にこのことを理解するために働いているように見えるので、私はこれに答えただけです。それは私が一緒に仕事をするのが好きなタイプの人々なので、結果としてどこかが良くなるのに役立つことを願っているという理由だけで、私はより批判的です。:)

構造名

  1. ComplexNumber不必要に長いです。Single名前にDouble、、、、Int32などInt64が含まれていないことに注意してくださいNumberComplexこれは、より適切な名前として提案します。
  2. Complex.NETFrameworkですでに確立されている名前と一致します。

実数および虚数のコンポーネント

  1. GetRealPart()GetComplexPart()メソッドではなく、get-onlyプロパティである必要があります。
  2. GetComplexPart()実際に架空の部分を返しているため、誤った名前が付けられています。
  3. .NET FrameworkにはすでにComplex構造があるため、名前を変更しないでください。したがって、Frameworkの規則を再定義する立場にない限り、プロパティにはとという名前を付ける必要RealがありImaginaryます。

オペレーション

のような既存の例System.Windows.Vectorを見ると、静的メソッドと演算子を提供することで数学演算が実装されていることがわかります。

public static Point Add(Vector vector, Point point);
public static Point operator+(Vector vector, Point point);

当然のことながら、この規則はSystem.Numerics.Complex構造に引き継がれました。

public static Complex Add(Complex left, Complex right);
public static Complex operator +(Complex left, Complex right);

概要

結果はクリーンで検証が容易で、誰もが期待するとおりに動作します。メソッドが静的であるため、thisキーワードは表示されない/表示されません。

public static Complex Add(Complex left, Complex right)
{
    return new Complex(left.Real + right.Real, left.Imaginary + right.Imaginary);
}

public static Complex operator +(Complex left, Complex right)
{
    return new Complex(left.Real + right.Real, left.Imaginary + right.Imaginary);
}
于 2010-04-03T17:17:36.000 に答える
1

このキーワードは、変数と、プライベート変数と同じ名前の引数がある場合にのみ使用します。すなわち

private String firstname;
public SetName(String firstname)
{
    this.firstname = firstname;
}
于 2009-12-04T08:37:48.440 に答える
0

はい、それは正しくて読みやすいように見えます。しかし、これはあなたのTAが答えるべきものではありませんか?

于 2009-12-04T08:20:20.543 に答える
0

このキーワードの使用は問題ないようです。

Complexのようなクラスの場合、GetRealPart()メソッドとGetComplexPart()メソッドを使用するのではなく、実数部と複素数部をintプロパティとして格納し、メソッドで使用する必要があると思います。

私はそれをこのようにします:

    class ComplexNumber
    {
        public int RealPart { get; set; }
        public int ComplexPart { get; set; }

        public ComplexNumber(int real, int complex)
        {
            this.RealPart = real;
            this.ComplexPart = complex;
        }

        public ComplexNumber Add(ComplexNumber c)
        {
            return new ComplexNumber(this.RealPart + c.RealPart, this.ComplexPart + c.ComplexPart);
        }
    }

以下は、これを使用する必要があるシナリオです。使用しない場合、割り当てのLHSとRHSの両方で、クラスメンバーではなくパラメーターが考慮されます。

public ComplexNumber(int RealPart, int ComplexPart)
        {
            RealPart = RealPart; // class member will not be assigned value of RealPart
            ComplexPart = ComplexPart;
        }
于 2009-12-04T08:21:21.523 に答える
0
double realPartCaller = this.GetRealPart();

省略thisGetRealPart()ても大丈夫です。しかし、を使用するthisと、メンテナに関しては非常に読みやすく、理解しやすくなります。

double realPartCaller = this.GetRealPart(); ==> bit more readable IMHO
double realPartCaller = GetRealPart();
于 2009-12-04T08:22:35.033 に答える
0

this読みやすさと保守性が向上すると感じているため、現在のインスタンスのメソッドとプロパティの両方にキーワードを使用することがますます増えています。これは、クラスに静的メソッドやプロパティもある場合に特に便利です。thisこれらは現在のインスタンスに関連していないため、もちろんキーワードを使用することはできません。を使用thisすると、違いがはっきりとわかります。

さらに詳しくは、クラス自体の中でも、静的メソッドとプロパティの修飾子としてクラス名を使用することを検討する必要があります。

于 2009-12-04T08:41:03.737 に答える
0

this答えに完全性を追加するためだけに、キーワードが必須の場合が1つあります。これは、クラスメンバーと同じ名前のローカル変数(またはメソッドパラメーター)がある場合です。この場合、なしで書き込むとthisローカル変数にアクセスし、withでthisクラスメンバーを設定します。説明する:

class MyClass
{
    public int SomeVariable;

    public void SomeMethod()
    {
        int SomeVariable;

        SomeVariable = 4; // This assigns the local variable.
        this.SomeVariable = 6; // This assigns the class member.
    }
}

これに続くいくつかのこと:

  • ローカル変数にクラスメンバーと同じ名前を付けることは常に避けてください(私は認めます、私は常にこれに従うとは限りません)。
  • thisすべてのメンバーアクセスの前に書き込むことは、安全策のように機能します。それなしでコードを記述し、後でクラスメンバーと同じ名前と型のローカル変数を導入した場合、コードは正常にコンパイルされますが、まったく異なる(おそらく間違った)動作をします。

ただし、メソッドパラメーターにクラスメンバーと同じ名前を使用する1つの例は、コンストラクターです。私はよくこのように書きます:

class MyClass
{
    public int VariableA;
    public string VariableB;

    public MyClass(int VariableA, string VariableB)
    {
        this.VariableA = VariableA;
        this.VariableB = VariableB;
    }
}

私の意見では、どのパラメーターがどのクラスメンバーを設定するかがすぐにわかるため、コンストラクターがより明確になります。

于 2009-12-04T09:06:55.880 に答える
0

命名規則に従う場合、これを使用することは後から必要になります。

class MyClass 
{ 
    public int _variableA; 
    public string _variableB; 

    public MyClass(int variableA, string variableB) 
    { 
        _variableA = variableA; 
        _variableB = variableB; 
    } 
}
于 2010-04-03T16:50:28.683 に答える