paint-brush
コードの臭い环节を見つける技巧 [パート XXII] に@mcsee
783 測定値
783 測定値

コードの臭い部分を見つける方法 [パート XXII]

Maximiliano Contieri8m2022/08/29
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

においがするのは、編集または改善できる場合が多いためです。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - コードの臭い部分を見つける方法 [パート XXII]
Maximiliano Contieri HackerNoon profile picture

コードの匂いは古典的です。

においがするのは、編集または调理できる場合が多いためです。


これらの臭いのほとんどは、何かが間違っている可能性があることを示しているだけです。それらはそれ自体を修正する必要はありません…(ただし、調べておく必要があります。)


前 コードの匂い

続けましょう...

Code Smell 106 - 生産依存コード

運用環境をチェックする IF を追加しないでください。

TL;DR: 本番環境に関連する条件を追加しないでください

問題

  • フェイル ファスト原則違反
  • テスト容易性の欠如

ソリューション

  1. 完全に必要な場合は、環境をモデル化し、それらすべてをテストします。

環境

場合によっては、開発と本番で異なる動作を制成する必需があります。たとえば、パスワードの強度。この場合、環境自体ではなく、強度戦略を运用して環境を構成し、戦略をテストする必须があります。

サンプルコード

違う

def send_welcome_email(email_address, environment): if ENVIRONMENT_NAME == "production": print(f"Sending welcome email to {email_address} from Bob Builder <[email protected]>") else: print("Emails are sent only on production") send_welcome_email("[email protected]", "development") # Emails are sent only on production send_welcome_email("[email protected]", "production") # Sending welcome email to [email protected] from Bob Builder <[email protected]>

class ProductionEnvironment: FROM_EMAIL = "Bob Builder <[email protected]>" class DevelopmentEnvironment: FROM_EMAIL = "Bob Builder Development <[email protected]>" # We can unit test environments # and even implement different sending mechanisms def send_welcome_email(email_address, environment): print(f"Sending welcome email to {email_address} from {environment.FROM_EMAIL}") # We can delegate into a fake sender (and possible logger) # and unit test it send_welcome_email("[email protected]", DevelopmentEnvironment()) # Sending welcome email to [email protected] from Bob Builder Development <[email protected]> send_welcome_email("[email protected]", ProductionEnvironment()) # Sending welcome email to [email protected] from Bob Builder <[email protected]>

検出

  • [×]マニュアル
これはデザインの匂いです。空の開発/運用構成を制作し、カスタマイズ概率なポリモーフィック オブジェクトで委任する必要性があります。

タグ

  • カップリング

結論

テスト必须能な生活条件を追加することは避けてください。ビジネス ルールを委任する構成を制成します。抽像化、プロトコル、およびインターフェイスを使用的し、ハードな階層を避けます。

関係

Code Smell 56 - プリプロセッサ

より詳しい情報

クレジット

による艺术照このツイートは @ にインスパイアされたものです。


複雑さは、技術的な未熟さの表れです。 ATM であろうとパトリオット ミサイルであろうと、使いやすさは優れた設計の製品の真の兆候です。

ダニエル・T・リン

ソフトウェアエンジニアリングの名言


Code Smell 107 - 変数の再利用

変数を再利用すると、スコープと境界をたどるのが難しくなります

TL;DR: 異なる的で同じ変数を読み書きしないでください

問題

  • 可読性
  • 隠れた問題

ソリューション

  1. 変数を再利用しない
  2. スコープを分離するExtract メソッド

環境

スクリプトをプログラミングするときは、変数を再利于するのが平常的です。これは冲突を招き、デバッグを困難にします。机会な限り範囲を狭める相应があります。

サンプルコード

違う

// print line total double total = item.getPrice() * item.getQuantity(); System.out.println("Line total: " + total ); // print amount total total = order.getTotal() - order.getDiscount(); System.out.println( "Amount due: " + total ); // variable is reused

function printLineTotal() { double total = item.getPrice() * item.getQuantity(); System.out.println("Line total: " + total ); } function printAmountTotal() { double total = order.getTotal() - order.getDiscount(); System.out.println( "Amount due: " + total ); }

検出

  • [ ]自動
リンターは详细分析ツリーを实用して、変数の定義と实用法を見つけることができます。

タグ

  • 可読性

結論

変数名の再通过は避けてください。より中应的で異なる名前を食用してください。

関係

Code Smell 03 - 関数が長すぎる

より詳しい情報

リファクタリング 002 - Extract メソッド

クレジット

による个人写真
汎用性の前にシンプルさ、再巧用の前に的使用。

ケブリン・ヘニー

ソフトウェアエンジニアリングの名言


Code Smell 108 - 浮動アサーション

2 つの浮動小数点数が同じであると主張するのは非常に難しい問題です

TL;DR: float を比較しないでください

問題

  • 間違ったテスト結果
  • 壊れやすいテスト
  • フェイル ファスト原則違反

ソリューション

  1. 実際のパフォーマンスの問題がない限り、フロートは避けてください
  2. 任意精度の数値を使用する
  3. フロートを比較する必要がある場合は、許容範囲と比較してください。

環境

浮動小数点数の比較は、古いコンピューター サイエンスの問題です。一般说来の解決策は、しきい値の比較を实用することです。 float をまったく适用せず、無限gps精度の数値を适用することをお勧めします。

サンプルコード

違う

Assert.assertEquals(0.0012f, 0.0012f); // Deprecated Assert.assertTrue(0.0012f == 0.0012f); // Not JUnit - Smell

Assert.assertEquals(0.0012f, 0.0014f, 0.0002); // true Assert.assertEquals(0.0012f, 0.0014f, 0.0001); // false // last parameter is the delta threshold Assert.assertEquals(12 / 10000, 12 / 10000); // true Assert.assertEquals(12 / 10000, 14 / 10000); // false

検出

  • [ ]自動

float のチェックを避けるために、テスト フレームワークに check con assertEquals()を追加できます。

タグ

  • においのテスト

結論

float の比較は常に避けるべきです。

関係

Code Smell 71 - 小数点を装った魔法の浮動小数点数

より詳しい情報

クレジット

による高清写真
神は理所当然数を作った。他のすべては人間の仕事です。

レオポルド・クロネッカー

ソフトウェアエンジニアリングの名言


Code Smell 109 - 自動プロパティ

コードの匂いを4つ組み合わせるとどうなる?

TL;DR: ゲッターを避け、セッターを避け、メタプログラミングを避ける。行動について考えます。

問題

ソリューション

  1. 自動セッターとゲッターを削除する

環境

セッターとゲッターは、業界の悪い習慣です。多くの IDE は、このコードの匂いを好みます。有一部电影の言語では、貧血モデルと DTO を構築するための明确表示的なサポートが供应されています。

サンプルコード

違う

class Person { public string name { get; set; } }

class Person { private string name public Person(string personName) { name = personName; //imutable //no getters, no setters } //... more protocol, probably accessing private variable name }

検出

  • [ ]自動
これは言語機能です。未熟な言語を避けるか、最悪の慣行を取缔する一定要があります。

タグ

  • カプセル化

結論

プロパティを公開する前に、妥当に検討する一定があります。初始のステップは、プロパティについて考えるのをやめ、行動だけに一起することです。

関係

Code Smell 28 - セッター

Code Smell 68 - ゲッター

Code Smell 70 - 貧血モデルジェネレーター

Code Smell 40 - DTO

Code Smell 01 - 貧血モデル

より詳しい情報

クレジット

による艺术照
厳しい締め切りの中で働きながら、片付けに時間をかけることほど難しいことはありません。

ケント・ベック

ソフトウェアエンジニアリングの名言


Code Smell 110 - デフォルトのスイッチ

デフォルトとは、「まだわかっていないすべて」を意味します。私たちは未来を予見することはできません。

TL;DR: ケースにデフォルト句を追加しないでください。特殊に変更します。明确表示的であること。

問題

ソリューション

  1. if と case をポリモーフィズムに置き換える
  2. デフォルト コードを例外に変更する

環境

ケースを选择するときは、平常、失敗しないようにデフォルトのケースを追加します。失敗は、証拠なしに決定を下すよりも常に優れています。

ケースやスイッチ類も臭いですから避けられます。

サンプルコード

違う

switch (value) { case value1: // if value1 matches the following will be executed.. doSomething(); break; case value2: // if value2 matches the following will be executed.. doSomethingElse(); break; default: // if value does not presently match the above values // or future values // the following will be executed doSomethingSpecial(); break; }

switch (value) { case value1: // if value1 matches the following will be executed.. doSomething(); break; case value2: // if value2 matches the following will be executed.. doSomethingElse(); break; case value3: case value4: // We currently know these options exist doSomethingSpecial(); break; default: // if value does not match the above values we need to take a decision throw new Exception('Unexpected case ' + value + ' we need to consider it'); break; }

検出

  • [x]半自動
认同がない限り、デフォルトの用について警告通知するようリンターに指的是できます。

タグ

  • フェイルファスト

結論

堅牢なコードを書くことは、証拠なしに決定を下す必要性があるという象征ではありません。

関係

Code Smell 36 - Switch/case/elseif/else/if ステートメント

より詳しい情報

クレジット

のによる艺术照
機能を追加するコストは、コーディングにかかる時間だけではありません。コストには、以后の拡張に対する障害の追加も含まれます。コツは、互いに競合しない機能を選択することです。

ジョン・カーマック

ソフトウェアエンジニアリングの名言



そして、それは今のところすべてです…次の記事では、さらに5つのコードの匂いについて説明します!
바카라사이트 바카라사이트 온라인바카라