-2

だから私の質問は基本的なカプセル化についてです。ゲッターとセッターを正しく設定していることはわかっていますが(実際には後で質問があります)、複数のクラスがあります。私には別のクラスがあり、特定のものを公開することで、コードの一部を外部のクラスで表示できるようにしていることを理解しています。ですから、最初のコードファイルを正しく設定したと思います。(いくつかの背景として、データベースに接続しているクラスと、すべてのデータをカプセル化するクラスがあります。投稿された最初のコードセクションはカプセル化部分であり、次に、混乱していた3つのメソッドを投稿します。)

取得と設定は大丈夫だと感じています。コンストラクターに少し不安を感じています。変数をパラメーターリストに入れて、外部クラスから値を入れているような気がしますか?右?または、プライベート変数のパブリック形式を他のコードファイルに入れて、それらを同じファイルのコンストラクターに渡す必要がありますか?

/これは私の最初のコードファイルです

using System;

public class clsEncapsulate
  {
    private int mID;
    private string mName;
    private string mClassification;
    private DateTime mConvocationDate;
    private string mLocation;

public int ID
{
    get
    {
        return mID;
    }
    set
    {
        mID = value;
    }
}

public string Name
{
    get 
    {
        return mName;
    }
    set 
    {
        mName = value;
    }
}

public string Classification
{
    get
    {
        return mName;
    }
    set 
    {
        mName = value;        
    }
}

private DateTime ConvocationDate
{
    get
    {
        return mConvocationDate;
    }
    set
    {
        mConvocationDate = value;
    }
}

private string Location
{
    get
    {
        return mLocation;
    }
    set
    {
        mLocation = value;
    }
}

public clsEncapsulate(int id, string name, string classification, DateTime convocationDate, string location)
{
    bool running = false; 

    while(running == false)
    {

    ID = mID;
    Name = mName;
    Classification = mClassification;
    ConvocationDate = mConvocationDate;
    Location = mLocation;

    running = true;

    }
}

}

2番目のコードファイルには、問題のあるメソッドを記述します。

private void refreshbox()
{
    string formattedConvocation;
    string formattedDateTime;
    string formattedConvocationName;

    lstConvocations.Items.Clear();
    foreach (clsEncapsulate currentConvocation in mConvocationAL)
    {
        formattedConvocationName = currentConvocation.Name;
        formattedConvocationName = truncateString(formattedConvocationName, 30);

        formattedConvocation = formattedConvocationName.PadRight(33);
        formattedConvocation += currentConvocation.Classification.PadRight(17);

        formattedDateTime = currentConvocation.ConvocationDate.ToShortDateString().PadRight(10)
            + currentConvocation.ConvocationDate.ToShortTimeString().PadLeft(8);
        formattedConvocation += formattedDateTime;

        lstConvocations.Items.Add(formattedConvocation);
    }
}

了解しました。2番目のコードファイルで最初のコードファイルの変数を操作するには、それらをこのメソッドに公開する必要があります。パブリック変数をコンストラクターに配置する必要があるのか​​、それとも最初のコードファイルのどこかに宣言する必要があるのか​​わかりませんでした。これらの変数をこのメソッドに公開する方法がよくわかりませんでした。私はそれをいじくり回しましたが、私の本はこの状況を正確に扱っておらず、私はそれを理解するのに苦労していました。

誰かがこの質問に答えるなら、なぜあなたがあなたが置くつもりであるものを置くつもりであるかを分解してください!たとえば、パブリック変数を別の場所ではなく、ある場所に配置した理由を理解したいと思います。または、カプセル化クラスのオブジェクトをある場所で宣言し、別の場所では宣言しないのはなぜですか。メソッドでカプセル化オブジェクトを宣言して、このメソッドに変数へのアクセスを許可しようとしましたが、機能しませんでした。私が間違っていたこと、または私のコードをもっと投稿してほしいかどうかを教えてください。

以下は私がめちゃくちゃにしていた他の2つの方法です。

/私がめちゃくちゃにしていた2番目のコードファイルからの2番目のメソッド:

private void displayProperties(int index)
{
    if (index == -1)
    {
        return;
    }

    clsEncapsulate selectedValue = (clsEncapsulate)mConvocationAL[index];


    txtConvocationName.Text = selectedValue.Name;
    txtConvocationClassification.Text = selectedValue.Classification;
    txtConvocationDate.Text = selectedValue.ConvocationDate.ToShortDateString();
    txtConvocationTime.Text = selectedValue.ConvocationDate.ToShortTimeString();
    txtConvocationLocation.Text = selectedValue.Location;
    txtID.Text = selectedValue.ID.ToString();
}

/私がめちゃくちゃにしていた最後の方法:

  private void readConvocations(string filterConstraint, string sortField, string     sortOrder)
{
        OleDbConnection connection = null;
    OleDbDataReader reader = null; 

    try
    {
        connection = new OleDbConnection();
        connection.ConnectionString = mConnectionString;

        connection.Open();

        string statement = "SELECT ID, Name, Classification, Location, Date FROM Convocations ";
        if(filterConstraint != "")
           {
                statement += "WHERE Name LIKE " + toSQL(filterConstraint, true) + " "; 
           }
            string statement2 = statement;
        statement = string.Concat(new string[]
        {
            statement2, "ORDER BY ", sortField, " ", sortOrder

        });

        OleDbCommand oleDbCommand = new OleDbCommand(statement, connection);
        reader = oleDbCommand.ExecuteReader();
        mConvocationAL.Clear();

        while(reader.Read())
        {

            clsEncapsulteconvocation = new clsEncapsulate();
            convocation.ID = (int)reader["ID"];
            convocation.Name = (string)reader["Name"];
            convocation.Classification = (string)reader["Classification"];
            convocation.Location = (string)reader["Location"];
            convocation.ConvocationDate = (DateTime)reader["Date"];

            mConvocationAL.Add(convocation);

        }
    }
    finally
    {
        if (reader != null)
        {
            reader.Close();
        }

        if (connection != null)
        {
            connection.Close();
        }
    }
}

私の状況を理解するのを助けるためにもっと詳しく説明する必要があるかどうか教えてください。私は語彙を学ぶのが初めてで、これを理解したいです!助けてくれてありがとう。:)

4

1 に答える 1

0

提供したコードは1つのパブリックオブジェクトと一連のプライベートメソッドであるため、コードがどのように連携するかを全体的に把握することは困難ですが、現在および将来、コードをより適切に構造化するために適用できる原則がいくつかあります。 。

SOLID(http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))について読んでください。SとDはあなたの例によく当てはまります。

また、あなたは建設業者と私有財産について言及しました。不変の型を調べてみてください。つまり、オブジェクトが作成されると、それを変更することはできません。clsEncapsulateクラスの場合、フィールドを読み取り専用にし、パブリックセッターを削除することを意味します。

幸運を。

于 2012-12-05T05:50:39.160 に答える