パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

非オブジェクト指向な「Javaプログラミング能力認定試験」」記事へのコメント

  • 私感だけど、
    オブジェクト指向というのは、再利用するライブラリを作成する場合は威力を発揮するのはよく分かる。
    しかし、再利用しない場合は不要だし、多人数で開発する場合は他人とのインタフェース部分だけオブジェクト指向的にすれば十分だと思う。
    他人に見せない内部まで生真面目にオブジェクト指向で作ったら、むしろコードサイズが大きくなり。処理が分散することで、かえって可読性が落ちる。

    • by Anonymous Coward

      オブジェクト指向というのは、再利用するライブラリを作成する場合は威力を発揮するのはよく分かる。

      発揮しません。再利用性で重要なのは、汎用性のある仕様です。オブジェクト指向で作ろうが、使えないものは使いたくありません。

      他人に見せない内部まで生真面目にオブジェクト指向で作ったら、むしろコードサイズが大きくなり。処理が分散することで、かえって可読性が落ちる。

      オブジェクト指向というか、カプセル化はきっちりした方がいいですよ。一人で書く場合も重要。書いているうちに共通部分が次第に見出せてくるので、そういうものをクラスに分離。そうして

      • by Anonymous Coward
        > 特にいらないのがアクセサ。アクセサなんか作ったら、データと処理を分離して書くことが可能になってしまうため、カプセル化の意味がありません。
        カプセル化という意味では、クラスが持っているデータを直接触らせないというのは非常に重要です。
        例えばgetHoge()というアクセサを用意した場合、hogeがどうやって得られるかをオブジェクトのユーザに意識させずに済むわけです。インスタンス変数かもしれないし、定数かもしれないし、別モジュールへ問い合わせた結果かもしれないし、何らかの計算結果かもしれないけど、とりあえずgetHoge()すればhogeが得られる。
        さらに重要なのは、何らかの理由でクラスの仕様を変える必要が発生して、例えばいままでクラス変数として保持していたのを別のモジュールへの問い合わせに変更したとしても、getHoge()の仕様さえ変わらなければオブジェクトのユーザのコードは変える必要がないということですね。

        アクセサ介さずにデータまでpublicとして見せるのはオブジェクトのユーザが、オブジェクトの具体的なデータ構造まで意識したい場合くらいですね。
        • by Anonymous Coward

          アクセサ介さずにデータまでpublicとして見せるのはオブジェクトのユーザが、オブジェクトの具体的なデータ構造まで意識したい場合くらいですね。

          逆だよ。アクセサを使うときは、オブジェクトの具体的なデータ構造まで意識したい場合。

          例えば、符号無しの多倍長整数を扱うクラスを作るとしよう。メンバ変数は、何らかの形で表現されたunsigned intの配列と、必要ならその配列の長さを保持するint型の変数としよう。そのとき、アクセサは必要?

          表示のためには、文字列を返すメソッドを作ればいい。四則演算はそのためのメソッドを作ればいい。それ以外の演算に

          • 符号無しの多倍長整数を扱うクラスを作るとしよう。メンバ変数は、何らかの形で表現されたunsigned intの配列と、必要ならその配列の長さを保持するint型の変数としよう。そのとき、アクセサは必要?

            そういう「アクセサが不要」なクラス設計で「アクセサが不要」と言われても、「一般論としてアクセサは不要」とは言えないでしょう。

            たとえば、アクセサと隠蔽の例によく挙げられるものとして複素数クラスがありますが、
            複素数クラスで、その実部と虚部にアクセスするアクセサは不要なものですか?

            こういうクラスでデータ

            • by Anonymous Coward on 2011年01月12日 0時09分 (#1886499)

              複素数クラスで、その実部と虚部にアクセスするアクセサは不要なものですか?

              はい。不要です。「アクセサ」の定義次第ではありますが。

              例えば、一般的なクラスにおいて、isZero()やisEmpty()がアクセサであるというのであれば、アクセサが不要などと言うことは言いません。そういうものは積極的に書くべきです。そういうものがないと、C++では、"obj == 0"と言うコードがあった時に泣けます。

              複素数クラスで、メンバ変数が不可変ではないのに、setReal()がなくて、getReal()だけでもアクセサと言うのであれば、アクセサが不要などと言うことは言いません。

              でも、getMagnitude()を用意せず、setReal()とgetReal()を両方用意して、「アクセサを作りました」というのなら、そんなアクセサはクソ食らえです。

              手続き型言語であれば、破壊的操作の方が記述しやすいので、メンバ変数を不可変にするのは制限が大きすぎます。とは言え、数学的に実部と虚部を別々に書き換えるというのは不自然です。実部と虚部、もしくはそのどちらかに新しい値を設定したいのであれば、新たにオブジェクトを生成した方が、自然に書けます。そういう意味で、setReal()、setImag()はいりません。

              でも、最初に書いた、isZero()やisEmpty()がアクセサというのなら、私はアクセサ肯定論者です。

              親コメント

私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson

処理中...