プログラミング設計パターンを把握できない


16

私は過去4年間javascriptを扱ってきました。私は自分の問題解決スキルに非常に自信があり、コードの品質が向上していることがわかります。私はコミュニティの最新情報を取得しようとしていますが、現在ES2015とReact.jsを使用しています。しかし、プログラミングの設計パターンをまったく把握できないと感じています。私はこれについてのリソースを見つける場所を知っており、私はすでにそれについての本を読んでいます。私はプロジェクトの構造について意思決定をするのに先輩に頼っていますが、それに取り組むのに問題はありません。

自分で何かを開始する必要があるときはいつでも、次の2つのパスを探します。もっと小さいものを使用している場合は、モジュールパターンを使用します。このテーマに関する理解が深まると、より良い決定を下せるようになることはわかっていますが、今のところは完全に失われています。

これに関する優れた教育を探すべきですか?このテーマに関する指導者は必要ですか?私はただ愚かですか?これは本当に理解しにくいですか?


6
私の意見では、デザインパターンを使用する必要性に関して、一部の言語は他の言語よりも「寛容」です。厳密に型指定されたコンパイル言語(JavaやC#など)は、JavaScriptやPHPなどの弱く型指定されたスクリプト言語よりも、悪い設計の影響を受けます。もちろん、デザインパターンが両方にとって有用ではないことは言うまでもありません。
マシュー

3
プロジェクトの規模も重要な役割を果たします。
マシュー

2
@Matthew nitpick必ずしも強く型付けされたJava / C#呼び出すとは限りません...
Jared Smith

2
@JaredSmith true、強く型付けされた型と静的に型付けされた型の区別を忘れがちです。
マシュー

6
一般的なパターンを理解しようとしている場合は、停止してください!何もありません!パターンは、よく発生する問題の一般的な解決策であり、誰かが名前を付けました。これですべてです。特定のパターンを把握するのは難しいかもしれません-私自身は、Javaでデュアルディスパッチを模倣するために「visitor」パターンを効果的に使用する方法を覚えているのに苦労していますが、「visitor」をリンクする秘密のソースを探している場合「データ転送オブジェクト」と言うと、見つかりません。それらは2つの一般的な問題に対する2つの一般的なソリューションであり、誰かが名前を付けて、名前が固まってしまいました。
ソロモンスロー

回答:


34

ソフトウェア設計パターンは、よく知られた問題に対するよく知られた解決策です。 それらを理解する方法は、パターンを学習し、それらがどのように機能するかを理解し、各パターンをソフトウェア設計に適用するのがいつ適切かを知ることです。

ソフトウェア設計パターンを学習する方法は、それらを一度に1つずつ調べることです。それは継続的な教育プロセスです。学習の足跡を減らしたい場合は、現在使用しているテクノロジーに直接関連するパターンを調べてください。

設計パターンについて知っておくべき重要な事項:

  1. 一部の設計パターンは、本質的にアーキテクチャーです。 MVCとMVVMはそのようなパターンの例です。このようなパターンは、提供する組織的および構造的な利点が必要なときに使用します。

  2. 一部の設計パターンは、プログラミング言語の欠陥に対する回避策です。 より表現力豊かなプログラミング言語を使用する場合、これらのパターンは必要ありませんが、多くの場合、この選択をすることはできません。大多数のGoFのパターンがあり、このカテゴリに

  3. ソフトウェアパターンは、パターンが解決するように特別に設計されている問題解決しようとしている場合にのみ使用してください ソフトウェアパターンをつなぎ合わせてアプリケーションを作成している場合、それは間違っています。

  4. 存在するすべてのコンピューティング問題に対する既存のソフトウェアパターンはありません。その場合、プログラミングは単にパターンマッチングの練習にすぎません。

  5. 一部のパターンは実際にはアンチパターンです。 これらのパターンがもたらす追加の複雑さは、それらが提供する利点を上回ります。パターンごとに、これらのパターンのどれを避けるかを自分で決める必要があります。


良い答えですが、ほとんどのGoFパターンはプログラミング言語の欠陥の回避策であるという声明には同意しません。言語は特定の問題と解決策を念頭に置いて設計される傾向があるため、多くの場合、特定の言語により適切に適用されるパターンがあります。
ポリグノーム

1
Gofパターンは20歳です。 それらのほとんどは、JavaがC ++に基づいているためにJavaが継承したC ++の問題を修正するために作成されました。
ロバートハーベイ

この答えのパラドックスは「よく知られている問題」の部分です。これらの「よく知られている問題」を一度も経験したことがなければ理解するのは困難です。
Fuhrmanator

2
JavaはC ++に基づいていません。javas 構文はC ++に触発されていますが、それには確かに基づいていません。両方の言語の動作はかなり異なります。Javaの実物のハードウェアは、テンプレートではなくジェネリックなどではなく、それ自体でメモリを管理するという事実から
Polygnome

4

学習に対する全員のアプローチは少し異なり、あなたの一般的なアプローチが何であるかは分かりませんが、自分を「バカ」とラベル付けして自分自身を傷つけていると思います。

個人的には、多くの人が「成功した」ソフトウェアエンジニアやデザイナーなどと呼ぶものを観察したことから、学習には共通のテーマ「経験」があります。これはあなたの「優れた教育」であり、アマゾンから大量の本を購入し、それらを読む(私の悪い習慣)よりもすぐに学ぶと思います。

したがって、たとえば、コマンドパターンのようなGOFパターンを使用して、選択した言語で実装します。それがあなたに与える利点と欠点を理解してください。設計パターンに関するさまざまな本がこれをあなたに説明しますが、私はその知識を実際に適用し、そこから学ぶ方が良いと感じています。読み物を割引かないでください。目的はありますが、ITの世界はほとんど教科書の練習ではありません。そうは言っても、それは私の意見であり、ITの世界に対する見方であり、一部は、ソフトウェアエンジニアリングでの私のキャリアを始めるときの自身の苦労を表しています。また、私が見る大きな問題は、経験豊富なソフトウェア開発者であっても、彼らがしていることを楽しみにしておくことを忘れていることです。それで、あなたが学んだことに時間をかけて、あなたがしていることを実際に楽しむことを忘れないでください。

さらに、他の人の実際の経験を活用してください。多数のオープンソースソリューションがあり、それは良くも悪くもあり、それらから学ぶことができます。彼らがどのようにパターンを適用したかを見て、あなたがどのようにそれと異なって取り組むかについて考えてください。

したがって、私の一般的なアドバイスは、あなたのアプローチが間違っていると感じたら、それを変更することです。自分が把握していないと感じる資料を学習していると感じている周囲の人々を見て、彼らが何をしているかを見てください。


1
プログラミングはチェスゲームのようなものだと本当に思います。ネイティブの才能があり、終日プレイするかもしれませんが、チェスに関する本を読んでいない場合、進歩はできず、より重要なことはゲームの美しさを理解できないことです。
エイドリアンイフトデ

@AdrianIftode-同意しました。前述のように、本、ブログ、その他の資料は割引しませんが、プログラミング言語/プラットフォーム/フレームワークなどに精通するために努力している人々が発見した共通の問題であり、コーディングや実用性はほとんどないようです努力が、しかしあなたが棒を振ることができるすべての本を読んだ。
荒涼とした惑星

@AdrianIftodeまあ、正確ではありません。本を読まずにチェスをプレイしても、ゲームについて多くを学ぶことができます。唯一の違いは、チェスマスターの経験や考えを利用してできるだけ早く学習していないことです。一方、特定のことについて考えてみると、チェスマスターからしか学べない人々が完全に見落としている1つまたは2つのソリューションに出くわす可能性があります。最終的には、両方の種類の学習を組み合わせることで最高のメリットが得られると思います。チェスとプログラミングの両方で。
cmaster-モニカの復元

1

短い答えは、あなたはそれらを必要としないということです。それらなしでコードを書くことができます。マシューがコメントで述べたように、これは言語が非常に柔軟でプロジェクトが小さくなる傾向があるJavaScriptで特に当てはまります。しかし、4年間プログラミングをしてきたのであれば、繰り返しや厄介なことに出会ったことがないと信じることは難しいと思います。あなたがデザインパターンを再発見するか、欠落しているそれらの領域。

例:JavaScriptのイベントシステムは、多くの場合、手元のタスクには不十分です。イベントのストリームを結合または変換できるようにしたいと思ったことはありませんか?または、その一連のイベントは、それ自体が第一級の値でしたか?メディエーターパターンまたはオブザーバーパターンが必要です。双方向のデータバインディングが必要ですか?同じ話。

壊れやすいプロトタイプ階層がダウンしたのか?Mixin / Trait / Subclass Factoryのパターンが助けになります。


4
設計パターンを使用せずに重要なプログラムを作成することは事実上不可能であり、通常は一般的なものも多く使用します。必要ないのは、使用しているパターンを名前で認識できるようにすることです。コード全体で使用しているデザインパターンのすべてに名前を付けることができない場合でも、作業コードを作成できます。
セルビー

@Servy Designパターンは抽象化であり、抽象化は厳密には必要ありません。基礎となる動作のアドホックな1回限りの実装をいつでも書き出すことができます。私はそのイベントに関する与えた例では、例えば可能手動ですべての関係者を配線して、彼らに要件の変更をすべてのすべての時間を変更するには、それだけでパブリッシュ/サブスクライブを使用する場合と比較して吸います。サブクラスの場合、(もし無駄であれば)一回限りのクラスを使用してあらゆる可能性を手動でコーディングすることができますが、それはあまり良くありません。
ジャレッド・スミス

1
設計パターンは非常に広くなる可能性があります。多くの場合、より広いデザインパターンは非常に明白であるため、デザインパターンとは見なしません(特に、特別な言語サポートがある場合)。ループは設計パターンです。関数はデザインパターンです。オブジェクトはデザインパターンです。
セルビー

@Servyそれがあなたの用語の使い方なら、私は同意しませんが、OPは特にGOFishパターンを意味するという印象を受けました。
ジャレッド・スミス

1
@JaredSmithデザインパターン抽象化ではありません。あなたが持っている具体的な問題のために何度も何度もそれらを実装しても、それらはまだパターンです。一般的なObserverクラスを作成し、それを使用してObserverパターンを使用する必要はありません。具象オブザーバーと具象メソッドを作成して登録し、通知するために、まだパターンを使用しています。難しいのは、パターンを認識することです。時にはあなたは、でもその名を知らなくても、パターンを使用している
Polygnome

1

メンター、非常に良い経験を持つ人から学びましょう。彼にコードを見て質問し、コードレビューを提出して、彼と協力してみてください。これは、コーディングスキルを向上させるための最良の方法です。

追加:

  • 好きなシンプルなOSSプロジェクトと協力する

  • 同じ問題を解決する方法が2つある場合は、常により単純な方法を選択してください

  • あらゆる種類の奇妙なエラーを自由に行うことができるサイドプロジェクトでいくつかの余分な経験を構築し、デザインパターン「難しい方法」(tm)を学習します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.