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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

7回答

8934閲覧

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

syogakusya

総合スコア67

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

3グッド

3クリップ

投稿2016/11/24 12:55

編集2016/11/24 13:01

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

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

LLman, sakana009👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

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

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


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

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

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

投稿2016/11/25 17:24

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syogakusya

2016/11/27 08:17

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

0

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

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

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

投稿2016/11/24 13:07

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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


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

投稿2016/11/26 03:33

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syogakusya

2016/11/27 08:16

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

0

ベストアンサー

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

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

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

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

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

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

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

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

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

投稿2016/11/25 10:58

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syogakusya

2016/11/27 08:24

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

0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

投稿2016/11/25 01:50

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2016/11/25 01:27

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

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

投稿2016/11/24 13:32

編集2016/11/25 02:15
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syogakusya

2016/11/25 03:20

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問