においがするのは、編集または改善できる場合が多いためです。
これらの臭いのほとんどは、何かが間違っている可能性があることを示しているだけです。したがって、それ自体を修正する必要はありません…(ただし、調べておく必要があります)。
以前のすべてのコードの匂い (パート i ~ XXXI) は、ここで見つけることができます。
続けましょう...
プログラミング初日に if/else を学びます。それから私たちは他のことを忘れます。
TL;DR: はっきり言ってください。エルスでも。
早い段階で 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 36 - Switch/case/else if/else/if ステートメント
UnsplashのElena Mozhviloによる写真
ソフトウェア チームの最大の問題は、他の全員が何をしているかを全員が確実に理解できるようにすることです。
マーティン・ファウラー
今日、私は自分の財布に支払いがあると思っていました。残高が0でした。パニックになりました。
TL;DR: Null は 0 ではありません。Error は 0 ではありません。0 は 0 です。
セキュリティの問題についてよく読みます。
特に暗号について。
先週、暗号ハック スレッドについて読みました。
財布に残高が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 でマスクされるパターンを見つけることができます。
ガイドとして常に最小の驚きの原則に従ってください。
Code Smell 139 - ユーザー インターフェイスのビジネス コード
UnsplashのJasmin Sesslerによる写真
Code Smells は私の意見です。
Null に対する私の本当の批判は、プログラムをチェックせずに高速に実行するか、チェックしてゆっくり実行するかを選択しなければならないという不必要なすべての苦痛が再び戻ってくるということです。
トニー・ホーア(無発明家)
変数に値を割り当てて使用しますが、変更することはありません。
TL;DR: 可変性について宣言的であること。
私たちは常にドメインから学んでいます。
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 Smells は私の意見です。
UnsplashのNoahBuscherによる写真
機能する複雑なシステムは、機能する単純なシステムから進化したものであることが常にわかっています。
ジョン・ガル
本格的な開発は、さまざまな人によって行われます。私たちは同意し始めなければなりません。
TL;DR: 異なる大文字と小文字の変換を混在させないでください
ケース規格を選ぶ
我慢して
さまざまな人が一緒にソフトウェアを作成する場合、個人的または文化的な違いがある可能性があります。
camelCase 🐫 を好む人もいれば、 snake_case 🐍、MACRO_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 Smells は私の意見です。
UnsplashのWolfgang Hasselmannによる写真
特殊なケースが多すぎる場合は、間違っています。
クレイグ・ゼロユニ
Maxint は、無効な ID に適した数値です。私たちは決してそれに到達しません。
TL;DR: 実際の ID と無効な ID を組み合わせないでください。実際: ID は避けてください。
特殊なオブジェクトを使用して特殊なケースをモデル化します。
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)
コード内の特別な定数と特別な値をチェックできます。
外部識別子に関連付けるために数字を使用する必要があります。
外部識別子が存在しない場合、それは数値ではありません。
Code Smells は私の意見です。
UnsplashのMarkusSpiskeによる写真
虫は隅に潜み、境界に集まります。
ボリス・バイザー
さらに 5 つのコードの匂いが間もなく登場します…