質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

【c#】プログラミングの設計を学ぶ方法

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 5,377

syogakusya

score 67

聞きたいこと

c#でよい設計ができるようになるためにどのように学習すればいいかアドバイスをください。

背景

私は業務で開発に携わっています。
業務の都合上、webアプリ・サービスアプリ・デスクトップGUIアプリなど、サーバーサイド・クライアントサイド問わず開発してきて、フォームなどに比べると少し規模の大きいシステムの開発も経験しました。
チームではなく一人で開発することが多いです。
c#については、市販の本を使って勉強してきました。
そのため、c#の言語機能については、理解が足りない範囲もありますが、ある程度は広く知っています。
本題なのですが、私は今、c#でもっとよいコードを書けるようになりたいです。そういった能力を伸ばしたいと思っています。
うまく表現できませんが、具体的には、どういったクラス設計にするべきか、クラス間のインターフェースをどのようにするべきかなど、与えられたソフトウェアの要件をよりよいc#のコードで実現できるようになりたいのです。
現在の環境では、業務を通じてそういったことを学ぶことはできません。
開発をする方は他にもいて、皆私の上司なのですが、静的フィールドの参照インスタンスを共有するために継承を使ったり、フィールドをパブリックにしたり、しばしばひとつのメソッドが千ラインくらいあったり、ちょっと異常です。(私の環境ではこれがデフォです。)
私が携わるソフトの開発期間も、私の力ではいつもぎりぎりといったところで、プログラムの設計について試行錯誤しながらじっくり悩むような時間はありません。
そこでc#の書き方を勉強したときと同じように本をつかって自習したいのですが、なかなかいい本がありません。
これまで勉強してきた本は文法や言語機能やフレームワークのことを説明して終わりで、私が今知りたいのはそういったことではないのですが、表現の仕方が分からないのもあり、その辺は前提でっていうような本が見つからずアドバイスを募ってみることにしました。
本でも何でもいいのですが、よい学習の仕方があれば教えてください。加えて、すでにシステム開発などに携わっていて、とりあえず納品できるソフトを作ることはできるけど、その先にいくのに伸び悩んでいるような人におすすめのスキルアップの指針などもあれば、具体的に教えてほしいです。
お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

+1

どういったクラス設計にするべきか、クラス間のインターフェースをどのようにするべきかなど、
与えられたソフトウェアの要件をよりよいc#のコードで実現できるようになりたいのです。

一般的な設計の学習として、他の回答者の方もおっしゃるように、
リファクタリングやデザインパターンの本を読むのは私もオススメです。


それを踏まえた上で、とくにクラスとインターフェイスの設計ということなら、
普及しているライブラリやフレームワークを分析してみると良いと思います。

各言語の標準ライブラリ(C#なら.NetFramework(のBCL))のクラスやインターフェイスを、
普段のように使う視点ではなく、作る視点で見直すと、発見があると思います。

自分で一から設計すると、ユーティリティクラスに機能を詰め込んだりしがちですから、
たとえば、どうクラスに分けるか、どんなメソッドを作るかだけでも参考になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/27 17:17

    ありがとうございました。
    リファクタリング・デザインパターンの本を読むことと、ライブラリの分析をやってみようと思います。

    キャンセル

checkベストアンサー

0

なんかひどい開発ですね。ただ、大手企業でも中小企業でもあるあるな話です。。....うちだと、50行くらいのメソッドやクラスでも、SOLIDの原則に反してる場合、コードレビューで突き返されます(私がレビューする側ですが...)。

学びの良書と言えば、マーティン・ファウラーやエリック・エヴァンスの本がおすすめです。むしろそれがデファクトスタンダードです。

ただし、ビギナーが読んで理解できるほど優しい本ではありません。
(私的に)一番いいのは、優秀な方に聞くことです。社内にいなければ社外に出ましょう。日本人でもスーパーな方はたくさんいますし、フリーの勉強会もたくさんあるので、そこで学ぶのが早いです。

私個人的におすすめな本だと、
エリック・エヴァンスのドメイン駆動設計(難しい)

新装版 リファクタリング(易しい)

Clean Code(良いけど品薄、英語版はすぐ買える)

C#実践開発手法(普通)

.NETのエンタープライズアプリケーションアーキテクチャ 第2版 (普通)

設計とコーディングの本がごちゃまぜで書いちゃいましたが、質問をみた感じだと、「C#実践開発手法」がよいかもしれません♪

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/27 17:24

    実例をあげていただき本当にありがとうございます。
    そうですね、他社が書いたコードの改修依頼などもありますが、うちと大差ないです。
    多分うちとうちをとりまく企業が軒並みそんな感じなんだと思います。
    勉強会というのは少しハードルが高いので、さしあたって教えていただいた書籍を利用してみようと思います。
    道が開けた思いです。
    ありがとうございました。

    キャンセル

0

プリンシプル オブ プログラミング
を読んで、プログラムにどういう視点があるのかを見るといいかもしれません。

ちなみに内容は作者のブログのまとめなので
そっち読んだほうが安上がりです

あとは別言語であそぶとかですかね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

デザインパターンについては学習されましたか?  
全てのパターンが良いというわけではないのですが、アンチパターンも含めクラスやインターフェース設計のパターンを知るにはちょうど良いのではないかなと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/25 12:20

    デザインパターンというものが確立された設計手法としてあるということですか?
    それを学習するために最適な方法はありますか?

    キャンセル

0

周りにお手本となるような先輩・上司が見当たらないのでしたら、オープンソースでC#で書かれているものを探してソースを入手し解析してみてはいかがでしょうか。
オープンソースだから必ずしも洗練されたソースコードであるとは言い切れないかもしれませんが、自社とはまた違う文化で書かれたソースコードを読むことは、なにがしかのプラスになると思います。
思い切ってそういったオープンソースのプロジェクトに参加してみるというのもいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ほかの人と同様にデザインパターンがおすすめですが、クラス設計の前に、メソッドに分けることを憶えた方が良いと思いました。私が前にいた職場で同僚たちがやはり1メソッドが数百行になっていました。関数のくくりだしができないのです。

違うかもしれませんがほかの人の補足として書いてみます。(一度書いてみたい内容だったので、自己満足のためでもあります。)

C#でクラスの設計をする場合、インスタンスの変数はインスタンスのメソッドが共通で使います。
基本的には、構造体を第一引数に取るようなイメージです。

基本的に関数に分割出来ないとクラス設計は難しいです。

メソッドを括りだすときのヒントです。

・メソッドは再利用のためにではありません。一連の処理に名前(タイトル)を付けて詳細を隠すのが目的と考えてください。(正確には違うかもしれませんが、はじめはこれでいいと思います。)

・メソッドをくくるときのヒントは、戻り値です。戻り値は1つしか持てないのが学びやすくて良いことだと思います。

・引数の名前とメソッド名で何をしているかを説明しましょう。名前は非常に大事ですが、あとで修正すればいいです。

・メソッドを作るのに一番考えやすいのは判定式です。一目でなんの判定をしているのか判らないものは、メソッド名でわかるようにすべきです。

・戻り値が2つ欲しくそのうちどちらかを使いたいとなったときは、メソッドを呼ぶ前に判定式を入れましょう。

・戻り値2つ両方とも、使いたいときは面倒ですがメソッドを2つ作りましょう。判定式をメソッドにできていればそれほど面倒ではないはずです。

・引数の数にも注意しましょう。5個より少ないのが望ましいです。メソッドの分割を検討しましょう。

・ここまでできたら、1メソッド15行以下を目指しましょうそれほど難しくないはずです。2ヵ所で代入している変数を見たらメソッドにくくりだせないか考えてください。

そして、同僚には読みづらいという批判をする人もいるとおもいます。しかし、自分にとっては今まででは考えられないほど読みやすく、デバックがやりやすいソースコードになっている実感があります。また、1メソッドで書くより、思ったほど行数が増えていないことに驚くことになると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。
一般的な学習については他の人が解説してるので、もっと実践的な方向の回答を入れてみます。

自分の場合、プログラミングに関する本など一冊も読んだことがないので、あまり参考にならないかもしれませんが、自分が今までやってきた学習法で一番大きかったのはやはり「使用しているライブラリのソースを読む」ですね。
そこで、ILSpyというフリーソフトウェアをオススメします。
これはデコンパイラで、DllになっているライブラリをC#ソースコードにデコンパイルするアプリケーションです。
自分の使った機能が「どうやって書かれているのか?」と気になった瞬間にそのソースを(ある程度)読める形で見られるというのは、予想以上にスキルアップに繋がります。コレを使って、使用しているライブラリのソースを片っ端から読んでみてください。
MSの基本ライブラリなど、オープンソースになってたりするライブラリについてはそっちを読むのでもいいんですが、「今さっき使ったメソッドを」「今ここで」すぐに読めるっていうのは割と強力なメリットでもあります。
使用する際は、サードパーティ製ライブラリなどはデコンパイル禁止が書かれてたりするのでライセンスに気をつけてください。


もう一つ。
時間があるときに限りますが、「全く別のプログラミング言語の基礎だけでも触って覚えてみる」というのはかなり効きます。それも、C#とは概念レベルで大きく異なる言語……というかぶっちゃけHaskellなんですが。
データを不変にするメリットや、クラスなどデータ設計に関する知識など、C#をやってるだけだとなかなか身につかないものが一瞬で手に入ります。自分のクラス設計やデータフローの設計に関する知識はHaskellの言語仕様から仕入れたものです。
まあ、Haskellに限らず、「別の言語に触ってみる」というのはかなりイイですよ。思いもよらなかった方向から気付きを得られます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/27 17:16

    具体的な書籍名をあげてくださった方をベストアンサーにさせていただきましたが、デコンパイラを利用してのライブラリの解読をやってみます。
    年末などまとまった時間で別の言語を触るのもやってみようと思います。
    回答ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る