アプリ版:「スタンプのみでお礼する」機能のリリースについて

独学でプログラムを初めてもう何年かになるのですが、一つどうしても乗り越えられない壁があります。
OOPやデザインパターンなどに手を染めてからというもの、極端にクラス設計に拘って、プログラムがなかなか完成できないという状態に陥ってしまいました。
コードのイメージが出来ている内はガリガリ書けるのですが。。。

書籍なども色々あさって読んでみたのですが、例題や考え方などを見て「なるほど」とは思うのですが、いざ自分で起こそうとすると、
そのうち何が正しいのかわからなくなって、ああでもない、こうでもないと、コードを変えて、気がついたら殆ど何も進んでいない事が多々あります。
まずは完成させることが一番大事だと頭では分かっていても、なかなかうまくいきません。

もし、同じような状況にあったが脱した!という方がおりましたら、是非きっかけなどを教えていただきたいです。(こんな事に嵌るのは私だけかもしれませんが)
また、自分はプログラムを書くときこんなことをもっとも重視して考えている、というような話がありましたらお聞かせください。

非常に解答しづらい質問だとは思いますが、よろしくお願いします。

A 回答 (5件)

ちまたではよく「オブジェクト指向プログラミング」などの言葉が使われていたりしますが、厳密には以下の3つは異なります。



・オブジェクト指向分析
・オブジェクト指向設計
・オブジェクト指向開発

「根本から理解するオブジェクト指向分析/設計」
http://itpro.nikkeibp.co.jp/article/COLUMN/20061 …

「オブジェクト指向分析/設計概論」
http://www.asahi-net.or.jp/~dp8t-asm/java/articl …

質問者さんもご存知のとおり、そもそもソフト開発というのは以下のような工程を辿っていきますよね。

分析→設計→実装→テスト

で、前工程で遅れが発生すると、後の工程にそのシワ寄せがやってくる、と。基本的には、「チーム開発」だろうが「個人で大規模開発」を行おうが、同じことだと思います。用は、「仕様がちゃんと明確になっているのかどうか」ですね。

ちなみに、モデリング手法で有名な「UML」ですが、実際にはこれで全てが表現出来るわけではありません。確かに、UML2.0以降も様々なモデル図が追加されたりしていますが、それらでも表現できない要求定義のことを「非機能的要求」と言います。

>プロの方でも、それが許されるならば、一度何も考えずプロトタイプを組んでから俯瞰的に見渡して修正、または1から作り直した方が、むしろ早いのでしょうか。

「スパイラルモデル」や「ラウンドトリップ」のことですね。

スパイラルモデル
http://e-words.jp/w/E382B9E38391E382A4E383A9E383 …

クラス設計なども、複雑な所のみ入念に考えていけばいいのでは、と思います。Javaなどでは、メソッドや定数が一切定義されていない「マーカーインタフェース」(下位層のタグハンドラ用インタフェースを取りまとめるだけのJspTagインタフェースなど)があったりしますが、これなどは典型的な例ですね。確かに、クラス間の階層構造を明確にしていく為には、抽象クラスやインタフェースなどは必要ですが、通常はそのような枠に当てはめる必要は無いように思います。
    • good
    • 0
この回答へのお礼

レスが遅れて申し訳ありません。

回答者様のURLを拝見していて、各工程の認識が甘かったように思いました。
今までを振り返ってみますと、漠然とした思いつきで拡張性や再利用性、保守性などと考え、本来の要求とはかけ離れたところで悩み続けていました。
いずれにしろ「何を」「どうしたいのか」が明確になっていなければ、設計も実装も出来なくて当然ですよね・・・。いったい何を勉強していたんだか・・・。

>クラス設計なども、複雑な所のみ入念に考えていけばいいのでは、と思います。
確かにその通りかもしれません。
初めから端から端まで考える必要など無く、要所となるところを抑えていって、必要が生じればリファクタリングや再設計を行った方が現実的ですね。

少しクラスやオブジェクト指向といった概念だけに囚われすぎていたかもしれません。
プログラムはクラス関係を記述することだけが唯一の手法ではないし、OOPは手段の一つだと言うことを思い出しました。
もう一度初心に返り、本質を見極められるような勉強をし直そうと思います。

ありがとうございました。

お礼日時:2008/07/18 22:57

こんにちは。



回答者は、変数や手続き名称のネーミングを考えている時、質問者とほぼ近い状況になった経験があります。決めた名前が気にくわず、あーでもないこーでもないを繰り返していました。完成させなきゃいけないのに・・・と思いつつも。でもある師が、しっかり悩めばよい、難しいことをしているのだから、と言われてフッきれたのを思い出します。
    • good
    • 0
この回答へのお礼

ネーミングも難しい問題ですよね。
ネーミングにしても設計にしても、他人(あるいは未来の自分)が読める(変更できる)ソースを書こう、というところに根底があると思うのですが、
それに囚われて、ソースを書き上げるとこまで持って行けないというジレンマがあります。
良いネーミングも、良い設計も、それらが簡単ではない、という事は理解しているつもりですが、もしかしたらそれは私の理解より遙かに難しいことなのかもしれません。

貴重なお話ありがとうございました。

お礼日時:2008/07/13 15:11

現実世界の情報を直接に抽象化してクラス設計をするのは


かなり難しい作業です。
そこで、情報と思考の整理をする為、間にマインドマップ
を使った中間モデルを作るというマインドマップモデリング
という手法が有ります。
一度お試し下さい。

http://www.mindmapmodeling.jp/index.html
MindmapModeling

http://www.thinkit.co.jp/article/46/1/
【伝わる!モデリング】
Google Androidで携帯アプリ設計
第1回:UMLとマインドマップ
    • good
    • 0
この回答へのお礼

マインドマップモデリングというのは初めて知りました。
参考にさせていただきます。
ありがとうございました。

お礼日時:2008/07/13 14:50

何も考えずに直感でコードを書くのもいいですよ。



変数なんかはスコープを考えずにとりあえずグローバルにおいて、
コードは最低限、関数にまとめるぐらいにしておいて、
クラス設計なんて後回しです。
ある程度形になってきて「こりゃメンテナンスが大変だな」と
思ったら設計に気を回せばいいと思います。

優れた設計なんていうのは、複数人以上で協調してコードを書くときに必要なだけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘の通り、設計を考えてからコードを書くのは、一人で書いているアマチュアにとっては必要のないステップかもしれません。
最初にある程度設計をキッチリ決めておいた方が、コードがしっかり分割されて、
設計が気に入らなくて修正するにしても変更の影響を受ける箇所が少なくて済む、という思い込みがあったのですが、
思い返せば、実際は設計を決めてもコードを組み始めると予想外の事項が絡んできて、再設計・・以下ループ。というスパイラルに陥ってました。

プロの方でも、それが許されるならば、一度何も考えずプロトタイプを組んでから俯瞰的に見渡して修正、または1から作り直した方が、むしろ早いのでしょうか。

お礼日時:2008/07/13 14:47

デザインパターンは後付で「こんな時にはこんなパターンが適用出来る」実例集みたいなもので「こんな時にはこんなパターンを使う」という正解集ではありません。


人間、飛びぬけた天才とどうしよもないバカ意外は大抵、同じような問題では同じような結論に至ります。
(プログラミングの経験をつめば)意識しなくても何かしらのパターンで表現出来る構造になっているものです。
出来上がってから第三者にこのプログラムの構造は○○パターンになっていて…と説明するのに便利だけど○○パターンに当てはめて設計するもんじゃないと思います。

OOPも完璧な設計は無理です。
その為にリファクタリングとい方法論がある訳で、製作途中や完成後に気に入らない部分を直せば済む問題です。
OOPは手段であって目的ではありません。
プロには「動けばよい」は許されませんが、動かないのは問題外ですしアマチュアであればどんな手段を使っても目的が達成されれば問題無いでしょう。

自分の好きなように作れば良いのです。
    • good
    • 0
この回答へのお礼

「適用できる」のニュアンスを「構造がこうであれば、このようなクラス関係で構築した方がよい」という意味と誤解していたかもしれません。

>OOPは手段であって目的ではありません。
耳が痛いです。
例えば状態遷移を書くとしても、無理にステートパターンを当てはめるのではなく、
状態遷移の規模や求められる性質によって、オーソドックスなswitch文やテーブルでの実装も検討した方がよいかもしれません。

ありがとうございました。

お礼日時:2008/07/13 13:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!