paint-brush
コードの臭い部分を見つける方法 [パート XXXII]@mcsee
806 測定値
806 測定値

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

Maximiliano Contieri9m2023/03/08
Read on Terminal Reader

長すぎる; 読むには

においがするのは、編集または改善できる場合が多いためです。これらの臭いのほとんどは、何かが間違っている可能性があることを示しているだけです。したがって、それ自体を修正する必要はありません… (ただし、調べる必要があります。) 以前のコードのにおい以前のすべてのコードのにおい (パート i - XXXI) は、ここで見つけることができます。
featured image - コードの臭い部分を見つける方法 [パート XXXII]
Maximiliano Contieri HackerNoon profile picture

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


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

前 コードの匂い

以前のすべてのコードの匂い (パート i ~ XXXI) は、ここで見つけることができます。


続けましょう...


Code Smell 156 - 暗黙の Else

プログラミング初日に if/else を学びます。それから私たちは他のことを忘れます。


TL;DR: はっきり言ってください。エルスでも。

問題

ソリューション

  1. 明示的な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 を永遠に取り除く方法

クレジット

UnsplashElena Mozhviloによる写真


ソフトウェア チームの最大の問題は、他の全員が何をしているかを全員が確実に理解できるようにすることです。


マーティン・ファウラー


Code Smell 157 - バランス0

今日、私は自分の財布に支払いがあると思っていました。残高が0でした。パニックになりました。


TL;DR: Null は 0 ではありません。Error は 0 ではありません。0 は 0 です。

問題

ソリューション

  1. ゼロとエラーを明確に区別してください。

コンテクスト

セキュリティの問題についてよく読みます。


特に暗号について。


先週、暗号ハック スレッドについて読みました。


財布に残高が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 億ドルの間違い

クレジット

UnsplashJasmin Sesslerによる写真

免責事項

Code Smells は私の意見です。


Null に対する私の本当の批判は、プログラムをチェックせずに高速に実行するか、チェックしてゆっくり実行するかを選択しなければならないという不必要なすべての苦痛が再び戻ってくるということです。


トニー・ホーア(無発明家)


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


Code Smell 158 - 変数は変数ではない


変数に値を割り当てて使用しますが、変更することはありません。


TL;DR: 可変性について宣言的であること。

問題

ソリューション

  1. 変数を定数に変更し、そのスコープを明確にします。

リファクタリング

リファクタリング 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 は私の意見です。

クレジット

UnsplashNoahBuscherによる写真


機能する複雑なシステムは、機能する単純なシステムから進化したものであることが常にわかっています。


ジョン・ガル


コードの匂い 159 - mixEd_casei

本格的な開発は、さまざまな人によって行われます。私たちは同意し始めなければなりません。


TL;DR: 異なる大文字と小文字の変換を混在させないでください

問題

  • 可読性
  • 保守性

ソリューション

  1. ケース規格を選ぶ


  2. 我慢して

コンテクスト

さまざまな人が一緒にソフトウェアを作成する場合、個人的または文化的な違いがある可能性があります。

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 Smell 48 - 標準のないコード

より詳しい情報

名前とは正確には何ですか - パートI The Quest

すべての命名規則

免責事項

Code Smells は私の意見です。

クレジット

UnsplashWolfgang Hasselmannによる写真


特殊なケースが多すぎる場合は、間違っています。


クレイグ・ゼロユニ


Code Smell 160 - 無効な ID = 9999

Maxint は、無効な ID に適した数値です。私たちは決してそれに到達しません。


TL;DR: 実際の ID と無効な ID を組み合わせないでください。実際: ID は避けてください。

問題


  • 思ったよりも早く無効な ID に到達する可能性があります。


  • 無効な ID にもnull を使用しないでください。


  • 呼び出し元から関数への結合フラグ。

ソリューション

  1. 特殊なオブジェクトを使用して特殊なケースをモデル化します。


  2. 9999、-1、および 0 は、有効なドメイン オブジェクトと実装結合であるため、避けてください。


  3. 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 は私の意見です。

クレジット

UnsplashMarkusSpiskeによる写真


虫は隅に潜み、境界に集まります。


ボリス・バイザー


さらに 5 つのコードの匂いが間もなく登場します…