経験豊富なC ++エンジニアのチームにOOP / OODを「導入」する最良の方法


17

私は、OOPの概念を既存のチームメンバーに紹介するための、efficient辱としても抜け落ちない効率的な方法を探していますか?私のチームメイトはオブジェクト指向言語に慣れていません。私たちは長い間C ++ / C#を行ってきたので、テクノロジー自体はよく知られています。

しかし、私は周りを見回し、努力の大きな注入なしで(主にコードレビューの形で)、私たちが作り出しているのはクラス内にあるCコードです。いくつか例を挙げると、単一の責任原則、抽象化、結合を最小限に抑える試みはほとんど使用されていません。コンストラクターはないが、インスタンス化されるたびにmemsetを0にするクラスを見てきました。

しかし、私がOOPを立ち上げるたびに、誰もがうなずき、私が話していることを正確に知っているように見えます。概念を知ることは良いことですが、実際の作業の提供に関しては、私たち(他の人よりも)を適用するのは非常に困難です。

コードレビューは非常に役立ちましたが、コードレビューの問題は、事実の後にのみ発生することです。そのため、一部の人にとっては、書き直されたコード(ほとんどはリファクタリングですが、多くの時間がかかります)になります。また、コードレビューは、チーム全体ではなく、個々のエンジニアにのみフィードバックを提供します。

私は、プレゼンテーション(またはシリーズ)を行うというアイデアをいじり、OOPを、より良く記述でき、リファクタリングできる既存のコードの例とともに再び表示しようとしています。誰ももう所有していないいくつかの本当に古いプロジェクトを使うことができたので、少なくともその部分は微妙な問題ではないはずです。ただし、これは機能しますか?私が言ったように、ほとんどの人は長い間C ++をやっているので、a)彼らはそこに座って、なぜ彼らがすでに知っていることを言っているのかを考えているか、b)彼らは実際にそれをin辱として取るかもしれません数十年ではないとしても、長年やってきた仕事をどうやってやるのかわからないと伝えます。

コードレビューよりも幅広い聴衆に到達するが、同時に罰の講義のように感じない別のアプローチはありますか?

私は、完全に設計されたコードの理想的な理想を持っている大学の新鮮な子供ではありません。誰にも期待していません。私がこれを書いている理由は、紙の上にまともな高レベルのデザインを実際に持っている人のレビューをしたからです。ただし、クラスを想像する場合:A-> B-> C-> D、コードB、CおよびDはすべてほぼ同じパブリックインターフェイスを実装し、B / Cには1つのライナー関数があるため、最上位のクラスAは絶対に実行します主に4つのmongoメソッドでのすべての作業(メモリ管理、文字列解析、セットアップネゴシエーションなど)、およびすべての意図と目的のために、ほとんど直接Dを呼び出します。

更新:私は技術リーダー(この役職で6か月)であり、グループマネージャーを完全にサポートしています。私たちは非常に成熟した製品に取り組んでおり、メンテナンスコストは間違いなく知られています。



3
あなたは彼らの監督者または上司ですか?そうでない場合は、あなたの上司であるテクニカルディレクターのサポートはありますか?あなたがただの男であり、深いOOPデザインを使用せずに開発が何年も安定して生産的であるなら、あなたは無駄なコードは機能せず、管理も機能しないことをプログラマーに納得させるために苦労しますコードの生成に費やされたお金。
パトリックヒューズ

この投稿を行った後、関連するリンクがポップアップしました。これは、私の状況によく似ています:Programmers.stackexchange.com/questions/43214/…。私はまったく同じことを心配しています。問題は、彼らのチームに2人の開発者がいて、コードレビューでそれを確実に管理できることです。チームの規模(10以上)で機能するアプローチを探しています。すべての開発者と1対1でやり取りすることはできません。
DXM

回答:


5

SOLIDの原則に関する短いトレーニングを開発し、このトレーニングを提供してみませんか?私の現在の組織では非常にうまく機能しているようで、短いトレーニングを行うのは実際には楽しいです(関係者全員にとって)。

トレーニングを行ったとき、既存のコード(さまざまなプロジェクト)の病理学的な「悪い」例を検索し、原則を使用して段階的にプレゼンテーションでリファクタリングしました。これにより、

  1. これらのリファクタリングを行うことはそれほど難しくありません
  2. 時間がかからない
  3. 最終結果(慎重に選択された;-))は、元のコードよりも明らかに優れています。

5

コードレビューは非常に役立ちましたが、コードレビューの問題は、事後のみに発生することです。

1つのプロジェクトで、設計レビューを行いました。

15分。ホワイトボードで。コーディングの前に設計について話し合います。

最も重要な部分は、実装作業のに設計レビューをスケジュールすることです。

また、「Critical Design Reviews」もありましたが、これは大変で汗臭い取引でした。多くのドキュメントと長いプレゼンテーションが含まれていました。それらはスケジュールするのが難しく、ほとんどの場合、コーディングが開始されるまでプッシュされ、値がゼロになりました。

コーディング前の非公式の設計レビュー-プレッシャーなし-文書化なし-責任の割り当て方法とオブジェクトのコラボレーション方法についてのより良い議論を可能にします。


はい、既に説明したとおりに設計レビューを既に行っています。問題は中規模のタスクです。タスクが十分に大きい場合は、通常、最初のクラス図を作成するのに時間をかけます。その後、チームによって洗練されます。タスクが小さい場合、既存の高レベルの設計はすでに十分です。ただし、中規模のタスクの場合、設計に十分な考慮を入れることができないため、基本的なルールは「最適な判断を下してOOPに従う」ことです。これらのタスクを自分で行う場合、コーディングから始めて、それを継続的なリファクタリングと混合します。
DXM

...最終設計がどのようになるかをコードに決定させます。ただし、これらのタスクを一部のチームメンバーに任せると、コードレビューで時々見つけるのは、最初の投稿で説明したようなものです。
DXM

1
@DXM:何?あなたはそれらをやっていますか?それともしない?大規模な場合は、デザインのレビューを行っていません-あなたは他の人のためにデザインを行っています-誰がデザインをするかを学びますか?小さい場合は、「既存のデザインで十分」というデザインレビューを行っていません。デザインを無視すると誰が傾くでしょうか。中程度の場合、デザインを行わず、デザインをレビューしませんか?実際に設計レビューを行っているようには思えません。なぜ自分がそうだと言って、そうでない場合に3つの例を挙げますか?
-S.ロット

@ロット:あなたの反応を熟考すると、私の唯一の結論はあなたが絶対に正しいということです。私が言わなければならないことは、私は少なくとも8回この正確なアイデアを持ち出し、誰もが常に同意したということだと思いますが、ええ、私が決めたリズムを振り返ると、私たちは本当にそれを何もしていません。これについてさらに議論したいと思いますが、私はすでに厳密なQ&Aサイトで議論するためにMODによって訓練されています。チャットに移動できますか?状況をもっと説明し、あなたの脳(または他の人が参加したい人)を少し選びたいと思います。チャットをやったことがない、あなたはそれがどのように機能するか知っていますか?
DXM

@DXM:チャットは簡単です。あまり役に立たない。この最初の質問よりも詳細な質問がある場合は、これらのより詳細な質問をしてください。それがポイントです。いくつかのケースでは、「さらなる議論」は「次の理由で私の質問に対するあなたの答えが好きではない...」に相当します。回答が好きではないということは、単に回答が好きではないことであり、議論を必要としません。いくつかのケースでは、議論は「私の質問は曖昧ではなく、ただ読むことができない」になります。本当に役に立たない。質問してください。質問として。
S.Lott

4

私はあなたが開発者の何人かより若いが、食物連鎖の上位にいると仮定しています。

ダウン票に埋もれてしまうリスクは、「経験豊富なエンジニア」が実際に正しいことをしていることである可能性があります。

古いコードは、当時のハードウェアで迅速に実行されるように最適化される傾向がありました。とりわけ、これは継承のレベルを削減し、簡単な操作のための関数/メソッド呼び出しを回避することを意味します。

コンパイラーは長年にわたってずっと賢くなってきたので、かつては真実だったすべてがそうであるわけではありません-例えば、コンパイラーは小さな関数をインライン化することを選択するかもしれません。

おそらく、今後の道筋は、異なるアプローチを採用することです-開発者に、どのように/なぜ彼らの方法が教えられた理論よりも優れているのかを説明してもらい、それについて誠実であることです。


0

新しい/変更されたメソッドごとに100%の分岐カバレッジで単体テストをプッシュしても、メソッド間の結合は最小限になりません。


UTは良い考えですが、これが望ましい結果を達成すると確信していません。さらに、OOの基本原則の1つは、関数間の結合は避けられないということです。そのため、そのような結合関数を明示的に作成し、単一のクラスにグループ化することをお勧めします。
–MSalters

「機能間のそれぞれの結合は避けられない」ことに同意します。ただし、優れた設計により、各機能が結合される他の機能の数も削減されます。(クラスはこの目的のための単なる手段です)
イアン

0

Gang of Fourの「Design Patterns」ブックを選択することもできます。C ++に固有のものではないため、同僚のC ++の知識を公然と批判することはありません。しかし同時に、あなたが関連性があると考えるトピックを扱っています。また、この本は関連性があるとして広く受け入れられているため、理論的または非実用的であると簡単に却下することはできません。

一方、C ++は設計上も実際上も、純粋なオブジェクト指向言語ではないことを考慮してください。コンストラクター/メモリセットのストーリー全体は、RAIIを導入する必要があるように聞こえますが、これはオブジェクト指向技術ではありませんが、C ++に固有のものです(残念ながら-。ここで関連する書籍は、(詳細)効果的なC ++および(詳細)例外的なC ++です。


2
しかし、著者は、デザインパターンは一般にOOP / OODの入門ではないと明確に述べています!オーディエンスは、ハードコードデザインパターンカタログに飛び込む前に、まずOOPが提供するテクニックに精通している必要があります!「Head First Design Patterns」が良い紹介になります。
ファルコン

2
OPの説明から、OOP / OODを知っているようで、それを使用しないだけである(おそらく複雑すぎるのではないかと恐れて)ので、その場合、それが有用である理由を説明する本は、コード例よりも最も動機付けられるかもしれません。
ワイルドピーク

@wildpeaks:OPは反対です。彼らはOOP / OODを知りません。彼らはOOPを手続き的な方法でプログラミングしています。彼らは彼らにデザインテクニックを紹介するために何かを必要とします、そして、GoF本はこのシナリオ私見に合いません。
ファルコン

私は文章But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutとを参照してMy teammates are not new to OO languagesいましたが、OPがOOPについて話しているときにOOPを知ることについて嘘をついているかもしれないので、それが少し曖昧であることがわかります。
ワイルドピーク

1
@MSalters-デザインパターンの序文:「この本は、オブジェクト指向の技術やデザインの入門書ではありません。多くの本はすでにその良い仕事をしています。この本は、少なくとも1つのオブジェクト指向プログラミング言語とオブジェクト指向設計の経験も必要です。」この本は要件に適合しません。エントリレベルのOODを読む必要があります。
ファルコン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.