5

私は、大学の管理部門のラボプロセスと通信する通信ソフトウェアを作成しています。プロセスはシリアルポートを介して通信し、かなりのビットチェック/操作が行われます。私は次のようなヘルパークラスを作成しました。

public class Channel {

    public enum Kind {DIGITAL_IN, DIGITAL_OUT, ANALOG_IN, ANALOG_OUT, COUNTER_IN};

    private int resolution;
    private int number;
    private Kind kind;
    public byte[] bits;

    public Channel(Kind kind, int resolution, int number) throws Exception {
        if (resolution % 8 != 0) {
            throw new Exception("Resolution must be divisible by 8");
        }
        this.kind = kind;
        this.resolution = resolution;
        this.number = number;
        this.bits = new byte[resolution/8];
    }


    public int getResolution() {
        return resolution;
    }

    public int getNumber() {
        return number;
    }

    public Kind getKind() {
        return kind;
    }
}

今の私の質問は、この場合、私のbyte[]をパブリックとして宣言することは悪い習慣と見なされるかどうかです。LabProcessProtocolクラスでは、これらのチャネルビットにアクセスし、シリアルポートのプロセスから取得したものに応じて変更します。

Javaはプライベートであり、ゲッターとセッターを使用することがすべてだという予感がありますが、よくわかりません。この場合、それはとても複雑に見えます。

前もって感謝します。

4

6 に答える 6

9

まあ、パブリック フィールドに対する絶対的な禁止事項はありません。それが最善の解決策であると感じた場合は、恥ずかしがらずに実行してください。

そうは言っても、立ち止まって、達成したいことについて考えてください。すべてを非公開にすること自体が目標ではありません。アイデアは、不変条件を確立し、コードを理解しやすく、操作しやすくすることです。

では、あなたが で何をしたいのかを考えてみてくださいbyte[]- 他の人がそれに対して実行したい操作は何ですか? これらの操作のメソッドを用意することを検討してください。これは、フィールドをパブリックとして公開するよりも理解しやすく、クリーンです。また、許可したくない操作を検討してください(不変条件を確立する部分になります)。たとえば、フィールドに直接アクセスすると、byte[] を長さの異なる別のものに置き換えることができます。おそらくそれを防ぎたいでしょう。

それともbyte[]、独自の (ラッピング) クラスに値するほど多くのことが起こったのでしょうか? これはすべて、使用方法に依存します。

最後に、単純な public フィールドから始めることには何の問題もありません。より適切な解決策を見つけたら、後でいつでもリファクタリングできます。

注:「いつでも後でリファクタリングできます」は、パブリック API の一部であるクラスには適用されません (つまり、他の外部プロジェクトで使用されるライブラリを作成している)。パブリック API の設計 (単に「API 設計」と呼ばれることが多い) は、「内部」コードの設計よりもはるかに困難です。これはほんの一例です。これはおそらくこの場合には当てはまらないので、指摘したかっただけです。

于 2012-11-03T20:46:19.487 に答える
3

通常は、byte[]フィールドをそのままにprivateして、クラスの外部からフィールドを操作するメソッドを実装することをお勧めします。フィールドを(少なくともimho)と宣言するのがひどい習慣であるというわけではありませんが、そのままにしておくと、プロジェクトの開発/更新を続けるときに後で問題を回避できます。これは私の言いたいことをよく表していると思います。publicprivate

于 2012-11-03T20:42:53.867 に答える
3

プライベートにしますが、getter と setter だけを使用しないでください。ユーザーはbits配列にどのようにアクセスする必要がありますか? 彼らは常に最初の要素を取得していますか、それとも常に循環していますか? (ByteBufferここでいくつかの有用なアイデアが得られるかもしれません。または、ByteBuffer直接使用する必要があるかもしれません。) ユーザーが使用することを意図した方法でアクセスするためのメソッドを提供します。ゲッターとセッターを提供するだけではありません。

于 2012-11-03T20:52:16.853 に答える
2

bits[]アクセサー(ゲッター/セッター)を介して公開します。アクセサーを介して配列を公開することにより、少なくとも配列へのアクセスを特定のメソッドに注ぎ込みます。将来変更が必要になった場合でも、このフィールドへの直接アクセスに依存する大量のコードが不要になるため、柔軟性がわずかに向上します。

于 2012-11-03T20:42:43.477 に答える
0

実装を API から分離することに関心があります。将来、クラスの内部に何かを変更するときに、 API をChannel使用している他のコードをChannel変更せずに動作させたい場合は、getter と setter を使用し、privateフィールドを使用します。それ以外の場合は、publicフィールドを使用できます。ただし、これらの場合、bitsフィールドの名前とタイプでさえ実装の詳細であることに注意してください。私の意見では、内部フィールドの名前と型は他のクラスに影響を与えるべきではありません。

于 2012-11-03T20:50:55.267 に答える