実現したい事
これまで,基本三構造の構造化言語でコーディングしていたプログラムを「再利用性を高くする」ためにオブジェクト指向(クラス)を使ったプログラムに書き換えようとしています。
困っている事
下記,参考テキストを購読した結果,「グローバル変数がインスタンス変数候補になる」,「サブルーチン(関数)がメソッド候補になる」と書かれていました。なので,全ソース(.cpp)のグローバル変数と関数をまとめました。そこから,再利用性が高いクラスをどうやって作ったらよいのかが分からない状態です。クラス図やシーケンス図を作成したほうがよいのでしょうか?クラスの作り方やクラス設計の注意点を教えていただけると助かります。また,参考図書もありましたら,教えていただけると助かります。
【参考テキスト】
オブジェクト指向でなぜつくるのか 知っておきたいOOP,設計,関数型言語の基礎知識 平澤 章著
アプリケーション構成
3つのプロセス(.exe)があり,1つのメインプロセスの中で6個の画面フォームがある。
0. メインプロセス(Main.exe)
- A画面
- B画面
- C画面
- D画面
- E画面
- F画面
- 受信プロセス(Client.exe)
- 送信プロセス(Server.exe)
開発環境
OS:Windows7 32bit
IDE:Borland C++ Builder6
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答10件
0
何画面もあってクライアントサーバーに分かれているものを初心者が全部クラス図からきっちり書いて作り上げるのは無理だと思います。
クラスを小さくすればするほど再利用性は高くなります。
つまり大きなアプリを作る時には膨大な数のクラスを作ることになります。
まずは知っている方法で動く物を作り、ほんのわずかな部分を切り取って汎用的なクラスに置き換え、それを繰り返してリファクタリングするのが一番現実的かと思います。
もし知っている方法で作ることもできないのなら、今作ろうとしているものは大きすぎます。もう少し小さなものから始めてください。
投稿2018/12/20 01:35
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
クラスは、要するにデータと関数をひとまとめにしたものです。
別の表現をすると、C言語の構造体に関数を付け加えたものです。
C言語でプログラムを書く場合、特定の構造体へのポインタを引数にとり、その内容をアクセスして処理するような関数を書くことが比較的頻繁にないでしょうか?(キレイに設計されたプログラムではよく見る構造です。linuxのカーネルとか)
ざっくり、その構造体へのポインタを引数とする関数を当該構造体(=クラス)のメンバ関数としたものが、クラスです。(内部構造的にもそのように実装されています。)
そのような特定の構造体をclassとし、その構造体へのポインタを引数としていた関数を、そのclassのメンバ関数として設計することが始めると良いように思います。これだけでも再利用性が格段に上がります。
なお、オブジェクト指向には他にも非常に強力な機能が多数ありますが、まずは最も基本であるデータと関数のセットとして切り出すことから始めると入りやすいと思います。
投稿2018/12/20 02:49
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
基本三構造の構造化言語でコーディングしていたプログラムを「再利用性を高くする」ためにオブジェクト指向(クラス)を使ったプログラムに書き換えようとしています。
そもそも、必ずしも**「再利用性を高くする」=「オブジェクト指向(クラス)を使う」**ではありません。
オブジェクト指向で再利用というなら、基底クラスが該当すると思います。
抽象化しても必ずしも継承する場面は無かったということもありますし、関数化して再利用なら、classでなくとも良い訳で。
なので、質問は「オブジェクト指向での共通化設計のポイント」って事なのかなと。
再利用を高くするというのに該当するのは基底クラスと共通関数(場合によってはインターフェースも)ですから、洗い出しの為には先ず、クラス設計を行う必要があります。
その為にはシーケンス図作ったりクラス図作ったりが必要で、都合の良い裏技は存在しないと考えた方が良いと思います。
投稿2018/12/20 05:18
編集2018/12/20 05:26総合スコア25184
0
クラスの作り方やクラス設計の注意点
…に関連あるような,無いような,
ものすごーく曖昧 且つ しょぼい話を書きますが…
例えばあなたがある処理を「関数」として書くとき,そこには「関数にする理由,利点,etc...」があるハズ.
その処理をその場にダイレクトに書かずに関数化するのはなぜなのか?
「クラス」も同様で,ある処理とデータの集まりをクラスとして書かんとする際には,
やはり「クラスにする理由,利点,etc...」があるハズ(あって然るべき.とりえあず"class"って書きたいとかじゃなく).
その中には「再利用性」に繋がる要素もあるハズ.
そんな感じのことを考えてみてはいかがでしょうか.
投稿2018/12/20 02:23
編集2018/12/20 02:24総合スコア11656
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/20 02:56 編集
2018/12/20 03:10
2018/12/20 03:28
2018/12/20 04:00
2018/12/20 04:06 編集
2018/12/20 04:53
2018/12/20 05:03
2018/12/20 23:26
2018/12/21 01:29
0
... クラス図やシーケンス図を作成 ...
plantunl を使うと簡単に書けます。
- Visual Studio CodeとPlantUMLでソフトウェア設計図を描く方法
https://cpp-learning.com/vscode_plantuml/
最初から汎用的なものをつくるのはよくありません。
まずは動作するものを作り、コードの重複が出てきたり、リファクタする際に再利用性を高くすることを検討するとよいです。
- 共通化という考え方はアンチパターンを生み出すだけ説
https://hachibeechan.hateblo.jp/entry/dont-think-just-make-it-abstract
投稿2018/12/20 16:54
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
クラス図やシーケンス図を作成したほうがよいのでしょうか?
課題の解決にはなりませんが、基本的にクラス図やシーケンス図を描くクセは付けた方が良いです。
最初は流れや関連付けが頭に入っていますが、段々と大きくなって混乱しますし、時間が経つと忘れます。
今なら無料でVSCodeのアドインでPlantUMLやMermaidを使って手軽に描けるので、
頭の中を整理するために描いてみると良いです。
そして無駄や重複する部分はまとめて再利用出来る様にしていけば、自然と使いやすいクラスや関数が出来るし、他の人に説明する時も図を見せれば流れや意図が大体わかるようになります。
(むしろ他人にプロジェクト全体のソースコードだけを渡しても、解読に時間がかかります。)
投稿2018/12/20 01:39
編集2018/12/20 01:43総合スコア442
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/20 03:38
0
>>クラス図やシーケンス図を作成したほうがよいのでしょうか?
今の段階で浮かんでいるもので良いので軽く図にしてみて。
書くものは紙でもいいよ。
クラスの設計となると、参考書はかなり古い本だけどおすすめの本があるよ。
投稿2018/12/20 01:20
総合スコア3307
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/20 03:33
0
再利用性が高いクラスって、利用シーンを想定し「データをどう持つか?」「インプット/アウトプットをどう汎用的にするか?」といった設計によるところが大きいので、アプリケーションの設計を学ぶと良いです。
一般的には、抽象度合いを上げることで、汎用性は高まりますが、具体的なシーンでそのまま使えるケースは減ります。(当然逆もしかり)
バランス感覚の必要な作業でもあるので、先人/先輩にバランスを教えてもらうのが良いですし、ライブラリやフレームワークがどういった単位でまとめられているか確認してみるのも良い学習になると思います。
投稿2018/12/20 05:22
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
データがあって、そのデータを取り扱う関数群があれば、クラスにまとめられます。
そのデータを使うところではそのクラスをインスタンス化して使えば良いので、便利です。
また、そうしておくと、「だいたい同じなんだけど、ちょっと挙動を変えたものを作りたいんだよね」という要望があれば、継承して挙動を変えたい部分だけカスタマイズすればできます。
あんまり継承しまくってごちゃごちゃすると面倒くさいので、「本当に『ここはカスタマイズしないだろう』という機能だけまとめたクラスを作って、そこから子と孫を作って用途ごとに特化させて……」と整理したくなってくることでしょう。
逆に言うと、自分のプログラムで何を「データ」とみなすのかを理解していて、その「データ」に対する操作を関数として(コピペされまくったすぐに共通化できるコード片としてでも良いですが)書いている、という状況でないと最初の一歩を踏み出せません。
現状のコードがあまり綺麗でないのなら、クラスを使わずにリファクタリングする方が先かもしれません。
投稿2018/12/21 02:56
総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。