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

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

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

    • by Anonymous Coward

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

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

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

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

      • by Anonymous Coward on 2011年01月11日 10時21分 (#1886105)

        class Function {
        public: virtual int apply(int argument) = 0;
        };

        class FunctionAdd : public Function {
        private:
                int value;

        public:
                FunctionAdd(int value) { this->value = value; }
                int apply(int argument) { return argument + value; }
        };
        class FunctionDiv : public Function {
        private:
                int value;

        public:
                FunctionDiv(int value) { this->value = value; }
                int apply(int argument) { return argument / value; }
        };

        class Abstract1DMatrix {
        public:
                virtual ~Abstract1DMatrix() = 0;
                virtual int get(int index) = 0;
                virtual int set(int index, int value) = 0;

                int getSum() {
                        int sum = 0;
                        for (int i = 0; i apply(getQuick(i)));

                        return this;
                }
        };

        class Vector1DMatrix : public Abstract1DMatrix {
        private:
                int offset;
                std::vector* vector;
        public:
                Vector1DMatrix(size_t size, int offset) {
                        this->offset = offset;
                        this->vector = new std::vector(size);
                }
                ~VectorMatrix() { delete vector; }
                int get(int index) { return (*vector)[index + offset]; }
                int set(int index, int value) { (*vector)[index + offset] = value; }
                int size() { return vector->size(); }
        };

        class List1DMatrix : public Abstract1DMatrix {
        private:
                int offset;
                std::list* list;
        public:
                List1DMatrix(size_t size, int offset) {
                        this->offset = offset;
                        this->list = new std::list(size);
                }
                ~List1DMatrix() { delete list; }
                int get(int index) { return (*list)[index + offset]; }
                int set(int index, int value) { (*list)[index + offset] = value; }
                int size() { return list->size(); }
        };

        int main() {
                Abstract1DMatrix* matrix = new Vector1DMatrix(512);
                /* 中略 */
                Function* func = new AddFunction(123);
                matrix->assign(func);
                /* 中略 */

        最近読んだコードで、こんな感じのヤツを見かけたんだけど、

        カプセル化、アクセサメソッドや継承を旨く利用してると思うんだ。

        これは単純化しすぎて、逆に難しいかも。

        親コメント
        • by Anonymous Coward
          あれ? preタグで囲んだ、getSumから一部のメソッドがおかしくなった。
          htmlという事を忘れて<をエスケープしてなかったのが原因か?

          int getSum() {
            int sum = 0;
            for (int i = 0; i < size(); i++) sum += get(i);
            return sum;
          }

          Abstract1DMatrix* assign(Function *f) {
            for (int i = 0; i < size(); i++) set(i, f->apply(get(i)));
            return this;
          }

ソースを見ろ -- ある4桁UID

処理中...