においがするのは、編集または改善できる場合が多いためです。 これらの臭いのほとんどは、何かが間違っている可能性があることを示しているだけです。したがって、それ自体を修正する必要はありません…(ただし、調べておく必要があります)。 前 コードの匂い 以前のすべてのコードの匂い (パート i ~ XXXI) は、 見つけることができます。 ここで 続けましょう... Code Smell 156 - 暗黙の Else プログラミング初日に if/else を学びます。それから私たちは他のことを忘れます。 TL;DR: はっきり言ってください。エルスでも。 問題 可読性 認知負荷 不測の事態 フェイル ファスト原則違反 ソリューション 明示的なelseを書く コンテクスト 早い段階で IF 文に戻ると、else 部分を省略できます。 その後、 、ポリモーフィズムを使用します。 IF を削除し それは、実際のケースを見逃すときです。 サンプルコード 間違い function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; } 右 function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); } 検出 自動 [×] 構文ツリーをチェックして解析し、else の欠落を警告できます。 それらを書き換えて、突然変異テストを実行することもできます。 タグ 条件文 結論 この種のにおいは、多くの公の議論 もたらします。 と憎しみを 私たちは意見を交換し、それぞれの長所と短所を評価しなければなりません。 関係 Code Smell 102 - アローコード Code Smell 36 - Switch/case/else if/else/if ステートメント より詳しい情報 暗黙的な Else の使用をやめる 暗黙の Else を使用する場合 フェイルファスト 煩わしい IF を永遠に取り除く方法 クレジット の による写真 Unsplash Elena Mozhvilo ソフトウェア チームの最大の問題は、他の全員が何をしているかを全員が確実に理解できるようにすることです。 マーティン・ファウラー Code Smell 157 - バランス0 今日、私は自分の財布に支払いがあると思っていました。残高が0でした。パニックになりました。 TL;DR: Null は 0 ではありません。Error は 0 ではありません。0 は 0 です。 問題 ヌル UX 使いやすさ ソリューション ゼロとエラーを明確に区別してください。 コンテクスト セキュリティの問題についてよく読みます。 特に暗号について。 先週、 について読みました。 暗号ハック スレッド 財布に残高が0と表示されたとき、私はパニックになりました。 それは単なるUXの匂いでした。 ブロックチェーンに到達できませんでした💩 サンプルコード 間違い """ Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0 右 """ Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain") 検出 マニュアル [×] これはデザインの匂いです。 または スローされ、0 でマスクされるパターンを見つけることができます。 例外 リターン コードが タグ UX 結論 ガイドとして常に に従ってください。 最小の驚きの原則 関係 コードの匂い 12 - ヌル Code Smell 139 - ユーザー インターフェイスのビジネス コード Code Smell 73 - 予想されるケースの例外 Code Smell 72 - リターン コード より詳しい情報 Null: 10 億ドルの間違い クレジット の による写真 Unsplash Jasmin Sessler 免責事項 Code Smells は私の です。 意見 Null に対する私の本当の批判は、プログラムをチェックせずに高速に実行するか、チェックしてゆっくり実行するかを選択しなければならないという不必要なすべての苦痛が再び戻ってくるということです。 (無発明家) トニー・ホーア ソフトウェアエンジニアリングの名言 Code Smell 158 - 変数は変数ではない 変数に値を割り当てて使用しますが、変更することはありません。 TL;DR: 可変性について宣言的であること。 問題 可読性 可変性を尊重します。 バイジェクションの 潜在的なパフォーマンスとメモリの問題。 ソリューション 変更し、そのスコープを明確にします。 変数を定数に リファクタリング リファクタリング 003 - 定数の抽出 リファクタリング 008 - 変数を定数に変換する コンテクスト 私たちは常にドメインから学んでいます。 によって値が変化する可能性があると推測することがあります。 MAPPER 後で、それが変わらないことを学びます。 したがって、それを定数に昇格させる必要があります。 これにより、 も回避されます。 Magic Constants サンプルコード 間違い <?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change } 右 <?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual 検出 自動 [×] 多くのリンターは、変数に割り当てが 1 つしかないかどうかをチェックします。 また、ミューテーション テストを実行し、変数を変更して、テストが壊れるかどうかを確認することもできます。 タグ 可変性 結論 変数のスコープが明確になったら、自分自身に挑戦してリファクタリングする必要があり、そのプロパティと についてさらに学びます。 可変性 関係 Code Smell 116 - 「var」で宣言された変数 Code Smell 127 - 可変定数 Code Smell 107 - 変数の再利用 Code Smell 02 - 定数とマジックナンバー より詳しい情報 ミュータントの邪悪な力 免責事項 Code Smells は私の です。 意見 クレジット の による写真 Unsplash NoahBuscher 機能する複雑なシステムは、機能する単純なシステムから進化したものであることが常にわかっています。 ジョン・ガル コードの匂い 159 - mixEd_casei 本格的な開発は、さまざまな人によって行われます。私たちは同意し始めなければなりません。 TL;DR: 異なる大文字と小文字の変換を混在させないでください 問題 可読性 保守性 ソリューション ケース規格を選ぶ 我慢して コンテクスト さまざまな人が一緒にソフトウェアを作成する場合、個人的または文化的な違いがある可能性があります。 🐫 を好む人もいれば、 🐍、MACRO_CASE🗣️ などを 。 camelCase snake_case 好む人もいます コードは簡単で読みやすいものにする必要があります。 サンプルコード 間違い { "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" } 右 { "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one } 検出 自動 [×] リンターに会社の幅広い を伝え、それを強制することができます。 命名基準 新しい人が組織に到着するたびに、自動化されたテストが丁寧にコードを変更するよう依頼する必要があります。 例外 私たちの範囲外のコードとやり取りする必要があるときはいつでも、私たちの標準ではなく、クライアントの標準を使用する必要があります。 タグ ネーミング 結論 標準を扱うのは簡単です。 それらを強制する必要があります。 関係 Code Smell 48 - 標準のないコード より詳しい情報 名前とは正確には何ですか - パートI The Quest すべての命名規則 免責事項 Code Smells は私の です。 意見 クレジット の による写真 Unsplash Wolfgang Hasselmann 特殊なケースが多すぎる場合は、間違っています。 クレイグ・ゼロユニ Code Smell 160 - 無効な ID = 9999 Maxint は、無効な ID に適した数値です。私たちは決してそれに到達しません。 TL;DR: 実際の ID と無効な ID を組み合わせないでください。実際: ID は避けてください。 問題 違反。 バイジェクション 思ったよりも早く無効な ID に到達する可能性があります。 無効な ID にも 使用しないでください。 null を 呼び出し元から関数への結合フラグ。 ソリューション 特殊なオブジェクトを使用して特殊なケースをモデル化します。 9999、-1、および 0 は、有効なドメイン オブジェクトと実装結合であるため、避けてください。 Null オブジェクトの導入 コンテクスト コンピューティングの初期には、データ型は厳密でした。 その後、 を発明しました。 10 億ドルの間違い その後、私たちは成長し、多態的な特別な値を使用して特別なシナリオをモデル化しました。 サンプルコード 間違い #include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1) 右 #include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1) 検出 半自動 [x] コード内の特別な定数と特別な値をチェックできます。 タグ ヌル 結論 外部識別子に関連付けるために数字を使用する必要があります。 外部識別子が存在しない場合、それは数値ではありません。 関係 Code Smell 120 - シーケンシャル ID コードの匂い 12 - ヌル より詳しい情報 Null: 10 億ドルの間違い Y2K22 - 私たちを当惑させる過ち 免責事項 Code Smells は私の です。 意見 クレジット の による写真 Unsplash MarkusSpiske 虫は隅に潜み、境界に集まります。 ボリス・バイザー さらに 5 つのコードの匂いが間もなく登場します…