独学でプログラムを初めてもう何年かになるのですが、一つどうしても乗り越えられない壁があります。
OOPやデザインパターンなどに手を染めてからというもの、極端にクラス設計に拘って、プログラムがなかなか完成できないという状態に陥ってしまいました。
コードのイメージが出来ている内はガリガリ書けるのですが。。。
書籍なども色々あさって読んでみたのですが、例題や考え方などを見て「なるほど」とは思うのですが、いざ自分で起こそうとすると、
そのうち何が正しいのかわからなくなって、ああでもない、こうでもないと、コードを変えて、気がついたら殆ど何も進んでいない事が多々あります。
まずは完成させることが一番大事だと頭では分かっていても、なかなかうまくいきません。
もし、同じような状況にあったが脱した!という方がおりましたら、是非きっかけなどを教えていただきたいです。(こんな事に嵌るのは私だけかもしれませんが)
また、自分はプログラムを書くときこんなことをもっとも重視して考えている、というような話がありましたらお聞かせください。
非常に解答しづらい質問だとは思いますが、よろしくお願いします。
No.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インタフェースなど)があったりしますが、これなどは典型的な例ですね。確かに、クラス間の階層構造を明確にしていく為には、抽象クラスやインタフェースなどは必要ですが、通常はそのような枠に当てはめる必要は無いように思います。
レスが遅れて申し訳ありません。
回答者様のURLを拝見していて、各工程の認識が甘かったように思いました。
今までを振り返ってみますと、漠然とした思いつきで拡張性や再利用性、保守性などと考え、本来の要求とはかけ離れたところで悩み続けていました。
いずれにしろ「何を」「どうしたいのか」が明確になっていなければ、設計も実装も出来なくて当然ですよね・・・。いったい何を勉強していたんだか・・・。
>クラス設計なども、複雑な所のみ入念に考えていけばいいのでは、と思います。
確かにその通りかもしれません。
初めから端から端まで考える必要など無く、要所となるところを抑えていって、必要が生じればリファクタリングや再設計を行った方が現実的ですね。
少しクラスやオブジェクト指向といった概念だけに囚われすぎていたかもしれません。
プログラムはクラス関係を記述することだけが唯一の手法ではないし、OOPは手段の一つだと言うことを思い出しました。
もう一度初心に返り、本質を見極められるような勉強をし直そうと思います。
ありがとうございました。
No.4
- 回答日時:
こんにちは。
回答者は、変数や手続き名称のネーミングを考えている時、質問者とほぼ近い状況になった経験があります。決めた名前が気にくわず、あーでもないこーでもないを繰り返していました。完成させなきゃいけないのに・・・と思いつつも。でもある師が、しっかり悩めばよい、難しいことをしているのだから、と言われてフッきれたのを思い出します。
ネーミングも難しい問題ですよね。
ネーミングにしても設計にしても、他人(あるいは未来の自分)が読める(変更できる)ソースを書こう、というところに根底があると思うのですが、
それに囚われて、ソースを書き上げるとこまで持って行けないというジレンマがあります。
良いネーミングも、良い設計も、それらが簡単ではない、という事は理解しているつもりですが、もしかしたらそれは私の理解より遙かに難しいことなのかもしれません。
貴重なお話ありがとうございました。
No.3
- 回答日時:
現実世界の情報を直接に抽象化してクラス設計をするのは
かなり難しい作業です。
そこで、情報と思考の整理をする為、間にマインドマップ
を使った中間モデルを作るというマインドマップモデリング
という手法が有ります。
一度お試し下さい。
http://www.mindmapmodeling.jp/index.html
MindmapModeling
http://www.thinkit.co.jp/article/46/1/
【伝わる!モデリング】
Google Androidで携帯アプリ設計
第1回:UMLとマインドマップ
No.2
- 回答日時:
何も考えずに直感でコードを書くのもいいですよ。
変数なんかはスコープを考えずにとりあえずグローバルにおいて、
コードは最低限、関数にまとめるぐらいにしておいて、
クラス設計なんて後回しです。
ある程度形になってきて「こりゃメンテナンスが大変だな」と
思ったら設計に気を回せばいいと思います。
優れた設計なんていうのは、複数人以上で協調してコードを書くときに必要なだけです。
回答ありがとうございます。
ご指摘の通り、設計を考えてからコードを書くのは、一人で書いているアマチュアにとっては必要のないステップかもしれません。
最初にある程度設計をキッチリ決めておいた方が、コードがしっかり分割されて、
設計が気に入らなくて修正するにしても変更の影響を受ける箇所が少なくて済む、という思い込みがあったのですが、
思い返せば、実際は設計を決めてもコードを組み始めると予想外の事項が絡んできて、再設計・・以下ループ。というスパイラルに陥ってました。
プロの方でも、それが許されるならば、一度何も考えずプロトタイプを組んでから俯瞰的に見渡して修正、または1から作り直した方が、むしろ早いのでしょうか。
No.1
- 回答日時:
デザインパターンは後付で「こんな時にはこんなパターンが適用出来る」実例集みたいなもので「こんな時にはこんなパターンを使う」という正解集ではありません。
人間、飛びぬけた天才とどうしよもないバカ意外は大抵、同じような問題では同じような結論に至ります。
(プログラミングの経験をつめば)意識しなくても何かしらのパターンで表現出来る構造になっているものです。
出来上がってから第三者にこのプログラムの構造は○○パターンになっていて…と説明するのに便利だけど○○パターンに当てはめて設計するもんじゃないと思います。
OOPも完璧な設計は無理です。
その為にリファクタリングとい方法論がある訳で、製作途中や完成後に気に入らない部分を直せば済む問題です。
OOPは手段であって目的ではありません。
プロには「動けばよい」は許されませんが、動かないのは問題外ですしアマチュアであればどんな手段を使っても目的が達成されれば問題無いでしょう。
自分の好きなように作れば良いのです。
「適用できる」のニュアンスを「構造がこうであれば、このようなクラス関係で構築した方がよい」という意味と誤解していたかもしれません。
>OOPは手段であって目的ではありません。
耳が痛いです。
例えば状態遷移を書くとしても、無理にステートパターンを当てはめるのではなく、
状態遷移の規模や求められる性質によって、オーソドックスなswitch文やテーブルでの実装も検討した方がよいかもしれません。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学受験 大学受験 辛い 英語 読めない こんにちは。 現在大学受験をしてる者です。 色々あり浪人なんですけど 11 2022/09/06 12:03
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 大学受験 AO、総合型選抜出願時に使用する活動実績報告書について 4 2022/06/27 01:21
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 大学受験 数学について、自分はテストになると、(1)とかの簡単な問題も、間違っていないか何回も確認したり、問題 5 2023/01/26 17:17
- システム 質問です。 仮分数はどういう状態ですか? プログラムについてです。 例えば、とあるプログラムで、アイ 1 2023/07/24 01:39
- 会社・職場 社会人4年目 仕事ができない どうすればいい? タイトルの通り全く仕事が出来ず、今後どうしようか等悩 7 2022/06/25 18:49
- C言語・C++・C# チャットGPT 4について質問があります。 画像のような3つの種類がありますが、それぞれ何が違うので 1 2023/04/29 03:12
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- 楽器・演奏 ☆彡とある質問サイトでは独学と習うのではどちらが上手になるか?といった質問が上がっていますが 4 2022/09/27 10:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現で複数マッチ条件で悩...
-
RTKPOSTのファイル生成について
-
プログラミング
-
プログラミング ソースコード
-
windowsでテキストファイルの各...
-
Pythonって何を意識した言語な...
-
vba クリップボードクリアにつ...
-
Webサイト内に埋め込んだmp4動...
-
Arduinoに関する質問
-
chatGPTで次々と質問をしていく...
-
REGZAに接続できない(パソコン)
-
【IT導入補助金は個人事業主や...
-
そのまま使っただけなのに・・...
-
パイソンのプログラミングにつ...
-
I2C接続のLCDディスプレイを使う
-
昔のパソコン少年の武勇伝「店...
-
Pythonのスクレイピングの質問...
-
Pythonのライブラリをダウンロ...
-
P2P地震速報のEEW APIの仕様書...
-
フォルダを自動作成・移動を複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テストケース数
-
システム連絡表とは?
-
詳細設計・プログラム設計について
-
詳細設計書の書き方
-
結合テストの精査について教え...
-
UMLによるシステム設計について
-
Matlab ハイパスフィルタ
-
基本設計 詳細設計は何をするの?
-
みずほのプログラムを組んだSE...
-
12種のペントミノのうちm 個を...
-
設計書の書き方 業務の流れ
-
オブジェクト指向で開発されたP...
-
vncとultravncとrealvncの3つ...
-
データサイエンティストはITの...
-
Web開発の仕事について。 Web開...
-
Accessでナビゲーションウィン...
-
SQL ServerでDBを構築。これは...
-
AI尿検査のススメ
-
ペロブスカイト太陽電池につい...
-
北朝鮮のハッカーには、SWIFTと...
おすすめ情報