Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

『クラス設計を理解するためのおすすめの書籍』を教えていただきたいです

解決したいこと

『クラス設計を理解するためのおすすめの書籍』を教えていただきたいです

来年、定年(60歳)を迎えるSEです。
汎用機COBOL&JCL(&たまにExcel VBA)の世界で保険システム保守の仕事に従事してきました。

昨今、汎用機がサーバに置き換えられる事例がいくつか発生していて、本業以外の技術についてもっと知識が必要になってきたと感じています。
いろいろ考えた結果、とりあえず「C/C++」を覚えておけば様々な言語技術には応用が利くのではないか?ということに思い至りました。(英語が話せればその他の似た言語も話せるようになるのでは?みたいな安易な考えですね。英語話せないですけど...)

そこで書籍を何冊か買い込み、ここ5~6か月で時間を作って読み漁り、Visual Studioを使用してお試しでアプリをいくつか作成してみました。書籍に書いてあることでのお試しなので出来るのが当たり前ですね。
・ 新·明解C言語 中級編、柴田 望洋著、SBクリエイティブ
・ 新·明解C言語 実践編、柴田 望洋著、SBクリエイティブ
・ C言語ポインタ完全制覇、前橋 和弥著、技術評論社
・ 新・明解C++入門編、柴田 望洋、SBクリエイティブ
・ 新・明解C++で学ぶオブジェクト指向プログラミング、柴田 望洋著、SBクリエイティブ
・ プログラミング言語C++ 第4版、ビャーネ・ストラウストラップ、SBクリエイティブ

それじゃあということで、本職で約25年前に自分でExcel VBAを使用して作成したアプリを、C++で作成してみようと思い、Visual Studioの画面に向かっては見たものの全く手が動きませんでした。
何が障害かというと「クラス設計ができない」ということです。
COBOLとかExcel VBAは、クラスは意識しなくても作り始めることができたのですが、C++はクラス設計を意識して作らないと手が動かない(と思っているだけ?)のです。
どのデータメンバーと関数をまとめるのか?とかデータメンバーは更新しないけど文字列編集する関数はどこに書けばいいのか?など。

そこで、諸先輩方に『クラス設計を理解するためのおすすめの書籍』を教えていただきたいです。
「とりあえずこれは読んどけ」とか「これが難しくなくて良い」とか「これが分かりやすかった」など何でも良いです。よろしくお願いいたします。

※一応、Qiita内を「クラス設計 書籍」で検索してみた結果、以下の2冊は購入して読んでみようと考えてます。
・ 良いコード/悪いコードで学ぶ設計入門、仙塲 大也著、技術評論社
・ 現場で役立つシステム設計の原則、増田 亨著、技術評論社

0 likes

6Answer

どのデータメンバーと関数をまとめるのか?とかデータメンバーは更新しないけど文字列編集する関数はどこに書けばいいのか?など。

が疑問点だというですね。

オブジェクト指向黎明期(数十年ほど昔)には、"従来の設計との違い"に重点を置いた書籍も沢山ありましたが、最近はオブジェクト指向ありきで開発するので、実装方法について書かれているものが多いように思われます。
なので、結構古い本を漁ってみるのがいいかと思います。

ですが、書籍を探さずとも、少しの慣れで解決できる程度の疑問点だと思いますよ。

従来とは設計の仕方が違うことを意識してみては?
 従来) 処理の流れで全体像をつくる。
 今後) オブジェクトを組み合わせて全体像を作る。
という事に慣れれば、自ずと設計できるようになります。

どのデータメンバーと関数をまとめるのか?

これは、設計の方針によって正解は変わります。
プログラムとして、一番効率がいいものが正解です。

実装的な考え方としては、「データに関連する処理は同じクラスに所属させる」です。
設計的には、外から見た動作が、オブジェクトとして独立していてわかりやすいか否か。です。

データメンバーは更新しないけど文字列編集する関数はどこに書けばいいのか

更新しなくても、取り出しの時に編集されるのならメソッドで実装するのもありです。
独立して「編集できる文字列」としてクラスを作るのが正解の場合もあります。
編集がプログラム中の主要な処理なら、「編集装置」的なクラスを作るのもありです。
(クラス名は実装に合わせて良い名前を使ってください)


慣れないうちは、こんな考え方で実装できるんだろうかと不安になると思いますが、
オブジェクト指向に慣れれば設計が単純化されて効果的な実装が思い浮かぶようになります。

1Like

Comments

  1. ありがとうございます。
    C++は、本業(COBOL&JCL)の世界から全く違う世界に来たような言語仕様なので、今のところつかみどころのない感じがしています。
    やはり慣れが必要ですよね。トライ&エラーでチャレンジしてみます。

C++ を設計した Bjarne Stroustrup 氏は C++ を設計するにあたっての基本方針のひとつとして「スタイルを強制しない」ということを挙げています。 どんな流儀でプログラムを構成してもよく、こうすべきであるというような一貫した考え方は存在しません。 データメンバに (直接に) アクセスしない関数は非メンバ関数として書くべきと考える流儀もあれば大量のメンバ関数を持った巨大なクラスを指向する流儀もあります。 またはオブジェクト指向を無視しても構いません。

また、「C++ は今、使える言語でなければならない」ということも Bjarne 氏は言っています。 巨大な言語仕様を何か月、何年もかけて学んでいる間はプログラムを書き始められないということでいいのでしょうか? そんなわけないというのが C++ のこたえです。 現時点で習得している分だけで (綺麗ではないかもしれないが) とにかくプログラムを書くことは可能であり、高度な言語機能はより便利になるだけだという理念の下で C++ は設計されています。1

もちろん綺麗にクラスを設計して上手くカプセル化できるならそのほうが良いのは当然なんですよ。 でも、汚くても無様でもなんとかはなるというのが C++ らしさです。 COBOL や VBA に慣れているのなら COBOL や VBA っぽい構成でも構わないのでまずはそのまま完成させてみたらいいんじゃないでしょうか。

分野ごとに文化が違うのでとりあえずこれというようなひとつの資料を挙げるのは難しいですが、逆に言えば分野ごとの流儀はある程度は確立されていると思うので、やりたいことの分野で使われている適当なライブラリの流儀を真似するのが良いんじゃないかと個人的には思ってます。

それに加えて、典型的なパターンというものも一応は有るのでいわゆる「デザインパターン」系の本をひとつは読んだほうが良いかもしれません。

  1. 理念通りに実現されているかというとちょっと疑わしくはあるんですが。

0Like

Comments

  1. ありがとうございます。
    確かにおっしゃる通りですね。何とか完成させることにします。
    「デザインパターン」系の本も読んでみます。

クラスがある言語であっても、クラス設計がちゃんとされていないケースは多いと思います。

  • クラス設計をちゃんとしていなくても動かすことはできる
  • クラス設計についての知見が現場に無い

しかしながらクラス設計がちゃんとされていないコードは煩雑で保守が難しいものですので、クラス設計を学ぶことは良いことだと思っています。

クラス設計そのものについてフォーカスした書籍はそう多くない印象ですが、こちらはいかがでしょうか?

『オブジェクト設計スタイルガイド』 Matthias Noback 著1

クラス設計の作法(?)をまとめてあるような書籍です。

デザインパターンに関する書籍であれば、こちらでしょうか。

『Java言語で学ぶデザインパターン入門第3版』 結城 浩 著2

私が読んだのは増補改訂版で、第3版はそれの改訂版です。言語は異なりますが、考え方を学ぶにあたっては問題ないと思います。
C++の例であればこちらのサイトを参考にされてはいかがでしょうか。 https://refactoring.guru/ja/design-patterns/cpp

また『現場で役立つシステム設計の原則』の著者である増田 亨さんはクラス設計についてさまざまなイベントで登壇されている方ですので、その資料を読んでみるのもいいかもしれません。参考までにそのうちの1つを記載しておきます。

参考になれば幸いです。

  1. https://www.oreilly.co.jp/books/9784814400331/

  2. https://www.sbcr.jp/product/4815609801/

0Like

Comments

  1. いろいろ紹介していただきありがとうございます。
    実際の現場で、オブジェクト指向をうたった言語で開発していたとしても、しっかり設計されてない場合があるのですね。

    私の場合、C++は今のところ現場では使用しない(正確には、C++を使用した現場には参加させてもらえない)ので、切羽詰まっているわけではないです。ただ、独学とは言えどうせ学ぶのであればしっかりと学びたいと考えています。紹介していただいた書籍やサイトを読んで基礎をしっかり身に着けたいと思います。

それじゃあということで、本職で約25年前に自分でExcel VBAを使用して作成したアプリを、C++で作成してみようと思い、Visual Studioの画面に向かっては見たものの全く手が動きませんでした。
何が障害かというと「クラス設計ができない」ということです。
COBOLとかExcel VBAは、クラスは意識しなくても作り始めることができたのですが、C++はクラス設計を意識して作らないと手が動かない(と思っているだけ?)のです。

C/C++は低水準かつ、何か作るにしても面倒で情報も集めにくいので、とりあえずVisualStudioで簡単に動くものを作ってみたいなら、C#でWindowsフォーム辺りから始めてみればいいんじゃないでしょうか。C#じゃなくてもいいですが、ある程度流行っている言語の方が情報収集が楽です。クラス設計は横に置いといて、とりあえず動くものが出来るのはモチベーションに繋がります。
慣れてきたら、GitHubで既存のアプリやライブラリがどういう作り方をしているか眺めてみるのも勉強になると思います。
今だとAIに質問してみれば嫌な顔せずに何でも答えてくれるので、有効活用すればいいと思います。(嘘もよくつきますけど)

0Like

Comments

  1. ありがとうございます。
    確かにそうですね。形はどうでも良いのでAIを活用して、とりあえず動くアプリを作ってみます。

C++のSTL(標準ライブラリ)を使って手を動かして動作を見て理解するのが一番かなと思います。
STLは標準だけあってどの実装も割と洗練されたオブジェクト指向かつデザインパターンで設計されています。
ただし、いきなりコードを読むと高度なオブジェクト指向、デザインパターンが容赦なく使用されているのでコード単体の解読は困難です。
まずは実際にライブラリの使い方を見て、使ってみてバグフィックスしながら正しく設計されたオブジェクト指向とデザインパターンを使うとどんなことができるのか知っていくことが大切だと思います。
例えば可変長配列を実現する手段はvector,list,map,multimapなどありますが各実現方法には特徴があり、用途や向き不向きに応じて使い分けます。でも全要素へアクセスするループはイテレータパターンでどれも全く同じループ処理にすることができますし、処理が同じなので差し替えも容易になるというメリットが出て、より適した手段に後から変えることが容易になることを実感できると思います。

0Like

Comments

  1. ありがとうざいます。
    C++の入門書を何冊か買って読んでみてすごいなと感じたのは、おっしゃる通りSTLが標準で準備されていて、しかもC++のバージョンが上がる毎にコードが短く、洗練されていくことなんですよね。
    私が本職で扱っているCOBOLは、私が社会人になった頃からずっと変化がなく(もしかしたらバージョンアップとかしてたのかもしれないですが…)、ループを回すPERFORM VARYING~はコーディング規約でガチガチに決められているので変わりようがなかったりします。その分、50年前の作成日のプログラムが苦労もなく読めるという利点があります。
    それに比べるとC++はとても柔軟な言語のように感じます。
    まずはオブジェクト指向とデザインパターンに慣れることから始めたいと思います。

以前、以下本を読んでいた時にアセンブラからの言語の発展が書かれていて、オブジェクト指向やクラス化の便利さを学びました。
https://bookplus.nikkei.com/atcl/catalog/21/S00180/

具体的な技術の話は少ないですが、考えかたや、それが必要とされた背景や目的が分かるのでオススメです。

著名な書籍ですので、Qiitaで内容をまとめていたり、他サイトでまとめてらしてる方も多いので、それらを読んでから購入を決めるのもありと思います🙇

0Like

Comments

  1. ありがとうございます。
    紹介していただいた本のシリーズは、以前「ネットワークはなぜつながるのか」を読んだことがあり、(あまり細部まで理解はできませんでしたが)通信技術の仕組みがとてもよく考えられているな~、と感じた記憶があります。
    この本も読んでみたいと思います。

Your answer might help someone💌