4

現在、3人の開発者がいて、いくつかは相反するスタイルを持っています。私は王国に平和をもたらす方法を探しています...

コーダー:

Foo 1:パブリックメソッド内でFuncとActionを使用するのが好きです。彼は、アクションを使用して長いメソッド呼び出しをエイリアス化し、Funcを使用して、1行または2行で表現でき、コード全体で頻繁に使用される単純なタスクを実行します。

長所:彼のコードの本体は簡潔で非常に読みやすく、多くの場合、クラスごとに1つまたは2つのパブリックメソッドしかなく、プライベートメソッドはほとんどありません。

短所:メソッドの開始には、他の開発者が読むのが好きではないラムダリッチコードのブロックが含まれています。また、場合によっては、他の開発者が本当に読みたくない高階関数を含めることができます。


Foo 2:パブリックメソッドが実行する必要のある(ほぼ)すべてのプライベートメソッドを作成するのが好きです。

長所:パブリックメソッドは小さくて読みやすいままです(すべての開発者にとって)。

短所:プライベートメソッドは多数あります。他のプライベートメソッドを呼び出すプライベートメソッド、...などを呼び出すプライベートメソッドを使用します。コードをナビゲートしにくくします。


Foo 3:実行する必要のあるすべての重要なタスクに対して、単一のpublicメソッドを使用してパブリッククラスを作成し、依存性によってそれらを他のオブジェクトに注入するのが好きです。

長所:簡単にテストでき、理解しやすい(1つのオブジェクト、1つの責任)。

短所:プロジェクトはクラスによって散らかされ、複数のクラスファイルを開いて、コードの機能を理解するとナビゲーションが煩雑になります。


これらすべてのテクニックを最大限に活用するのは素晴らしいことです...

Foo-1は、メソッドの開始時にまとめられたすべてのActionラムダシェナニガンとFuncラムダシェナニガンを除いて、ほとんどの場合、非常に優れた、読み取り可能な(ほぼdslのような)コードを持っています。

Foo-3は、高度にテスト可能で拡張可能なコードを備えており、一部のソリューションでは少し「中かっこ」を感じ、コードナビゲーションの微妙な違いがあります(VSで常にF12を押し、他の5つの.csファイルを開いて単一のファイルを確認します)メソッドは行います)。

そしてFoo-2...ジュニアが掘り下げやすいという事実を除いて、2つのパブリックメソッドと12のプライベートメソッドを含む1つの巨大な.csファイルについて何かが好きかどうかはわかりません。

私は、これらのコーディングスタイルの説明を大幅に単純化しすぎたことを認めます。しかし、3人の開発者を団結させるのに役立つパターン、慣行、または外交的操作を知っている人がいれば、それは素晴らしいことです。

実現可能性の観点から:

  • Foo-1のスタイルは、ラムダやFuncが読みにくいと感じる開発者がいるため、最も抵抗があります。
  • Foo-2のスタイルは、簡単に陥りやすいため、抵抗が少なくなります。
  • Foo-3のスタイルは、最も前向きな考え方を必要とし、時間が短い場合に実施するのは困難です。

これを機能させることができるいくつかのコーディングスタイルまたは規則に関するアイデアはありますか?

4

5 に答える 5

3

Foo-2 のプライベート メソッドが嫌いな理由はまったく明らかではありません。

あなたは「巨大な」.cs ファイルについて不平を言っていますが、なぜ Foo-1 のスタイルよりもかなり大きいのでしょうか? 同じ量のコードがありますが、アクションがラムダとして表現されるのではなく、メソッドに分割されているだけです。

正直なところ、私には Foo-2 が最良の選択肢のようです。パブリック API を公開したいものだけにして、最も簡単な方法で実装します。状況によってはラムダが適切であることは間違いありませんが、Foo-1 のスタイルはそれを極限まで行っているように聞こえます。

特に、2 つのパブリック メソッドに共通のサブタスクがあるかどうかを検討してください。Foo-1 のアプローチは、そのコードを複製することになります.Foo-2 のアプローチは、両方から呼び出されるプライベート メソッドに共通のコードを配置します...これは、私には賢明なアプローチのように思えます。

同様に、あなたはプライベート メソッドを呼び出すプライベート メソッドについて話します...確かに同等の Foo-1 コードは、ラムダ式を呼び出すラムダ式になるでしょう。

さらに、ホワイト ボックス ユニット テストに満足している場合は、Foo-2 のアプローチを使用すると、実装の「小さい」ビットを個別にテストすることで、「分厚い」パブリック API 実装を簡単にテストできます。メソッドのプライベート、またはリフレクションの使用。

Foo-3 は、実装ではなくパブリック API を変更しているという点で、まったく異なるアプローチのように聞こえます。これは、コーディング スタイルよりもデザインに関するものであり、個別に検討する必要があります。

于 2010-12-31T16:57:05.603 に答える
2

私の2セントでは、すべてに場所がありますが、1つのスタイル、特に1と3を排他的に使用するべきではありません。スタイル1には理解しにくいコードがあり、スタイル3ではオブジェクトモデルを作成するのが困難です。

集まって、それを試してみてください。これを行うのは驚くほど難しく、多くの場合、「正しい」ことを行うよりも、一貫性を得るための妥協が重要です。妥協者はここでは歌われていない英雄です。:)

Foo 1

「コルーチン」スタイルでプログラミングするために、ラムダとファンクをときどき使用するのが好きであることを認めなければなりません。ただし、これはまれであり、代替案がそれほどきちんとしていない場合、または設計意図を明確に表現している場合にのみ使用されます。

他の多くのプログラマーが何が起こっているのかを理解するためにコンパイラーをプレイしなければならないので、このスタイルのコーディングスキャンが一般的なプログラミングスタイル(少なくともC#では)と同じようにスキャンされるとは本当に思いません-良くありません。しかし、それは確かにその場所を持っています。

Foo 2

これは合理的なコーディングスタイルのように聞こえます。プライベートメソッド間に依存関係があるという事実は、DRYが小規模で機能しているだけです(うまく実行されている場合)。

Foo 3

DIを使用することは、このスタイル、つまりクラスごとに単一のパブリックメソッドを使用することを義務付けていません。最悪の場合、このスタイルは、OOで実際に「もの」をモデル化しようとしていることを忘れていることの兆候です。識別可能なオブジェクトモデルを持たない膨大な数のメソッドを結合することは素晴らしいことではなく、発見可能性は悪くなります。ただし、優れたオブジェクトモデルを作成するのは困難です。

于 2010-12-31T17:23:04.373 に答える
2

新しいルールや規則を導入する前に、チームの時間を確保し、現在のコードベースについて開発チーム内で敬意を持ってオープンな議論を開始する必要があると思います。開発者に、コーディングスタイルと、コードベースとそのコーディングスタイルの組み合わせについて彼らが好きなことと嫌いなことの両方について話し合ってもらいます。

要するに、物事をオープンに出してください。これは感情を悪化させるよりも健康的であり、コードの問題を修正するための新しいルールを導入したとしても、政治は残る可能性があります。

チームに、彼らが賢明な大人として扱われていること、そしてあなたが紹介するコーディング規約に何らかのインプットと影響力があることを感じさせてください。

最初に自己管理アプローチを試すことは常に価値があり、議論がうまくいけば、何も強制する必要がないかもしれません。

すべての中で最も重要なこと:すべての人が(自分自身を含めて)耳を傾けるようにしてください。

于 2010-12-31T17:03:58.640 に答える
1

特に新しい言語機能が登場した場合、特にFoo-1開発者がラムダを使用したい場合は、厳密なガイドラインに従うことはコンビニエンス開発者にとって非常に難しいことです。

Foo-1とFoo-2には、より機能的なプログラミングを使用するためのいくつかの類似点があるようです。

チームと同様に、主要な開発言語はC#です。これは主にオブジェクト指向であるため、開発に向けてよりオブジェクト指向のアプローチを採用し、再利用可能なコードにクラス/オブジェクトを使用するように説得する必要があります。テクニックの1つは、ピアレビューがチームメンバー間でも役立つことです。コードのすべての行に必要なわけではありませんが、いくつかの開始セッションが役立つ場合があります。最初にそれらのレビューを管理/開始してから、実行させる必要があります。

于 2010-12-31T17:05:10.037 に答える
1

これについてはさまざまな意見があると思いますが、クラスの内部実装は隠されているため、クラスの消費者にはそれほど大きな違いはないと私は感じています。したがって、Foo1 と Foo2 は基本的に同じで、違いは Foo3 だけです。また、複数のオブジェクトをあちこちに配置するのも好きではありません。どうしても Foo1 や Foo2 に頼る必要がある場合は、リファクタリングしてコードをサブクラスに移動するのが簡単な Foo2 を選びます。

于 2010-12-31T17:12:23.857 に答える