アンチパターン解説(基本データ型への執着、グローバル変数)
はじめに
本記事では「良いコード 悪いコードで学ぶ設計入門」で学んだ内容と別途気になって調べた内容や知識も含めアウトプットしています。
書籍ではJavaで説明されていたのですが本記事ではRubyに置き換えながら解説しています。
文字列型執着
文字列型執着とは
文字列型執着(String Typing Obsession)とは、プログラミングにおいて文字列型(String型)を過度に利用する傾向や、文字列型に対して固執する姿勢を指します。
同じ類の言葉で基本データ型への執着 (Primitive-obsession)というのもありますね。
例
次のコードは、単一の文字列変数に複数の値をカンマ区切りで格納しようとしています。
// ラベル文字列、表示色(RGB)、上限文字数 const title = "タイトル,255,250,240,64";
この場合、タイトルの文字列、表示色のRGB値、上限文字数が混在しています。しかし、このように複数の意味の異なる値を一つの変数に詰め込むと、コードの可読性が低下し、理解しにくくなります。
特に、データをCSVから取り出す場合を除いては、この方法は避けるべきです。
改善例
異なる意味を持つ値は個別の変数に格納します。
const title = "タイトル"; const color = { r: 255, g: 250, b: 240 }; const maxLength = 64;
各値が意味的に明確になり、コードの読みやすさと理解しやすさが向上し、データの利用や処理の際にも変数の値を直接参照することができます。
電話番号は文字列
電話番号は一般的には文字列(String型)として扱われます。
電話番号は数字の組み合わせで構成されていますが、数値(Number型)として扱うことで生じるデメリットがあります。
先頭の0が保持されない
・・・電話番号が0で始まる場合、数値として扱うと先頭の0が削除されてしまうため、電話番号としては不適切になります。ハイフンや括弧などの特殊文字
・・・ 電話番号にはハイフンや括弧などの特殊文字が含まれることがあります。数値として扱うとこれらの特殊文字が無視されてしまいます。
文字列型では先頭の0や特殊文字を保持することができ、正確な電話番号の表現や処理が可能になります。
また、正規表現を使用して電話番号の形式の検証や変換などの操作も容易に行えます。
グローバル変数
グローバル変数とは
グローバル変数は、プログラムのどの場所からでもアクセス可能な変数です。
どの関数やメソッドの中でも、クラスやオブジェクトの中でもなく、”プログラム全体で共有される変数” として使われます。
Rubyのグローバル変数
Rubyでは以下の用に定義されます。
# グローバル変数の宣言と初期化 $global_variable = 10 def some_method # グローバル変数へのアクセス puts $global_variable end def another_method # グローバル変数へのアクセス $global_variable = 20 end # メソッドの呼び出し some_method another_method some_method
JavaScriptのグローバル変数
JavaScriptでは関数の外(グローバルスコープ)で定義された変数がグローバル変数となります。
言語設定やテーマカラーなどのアプリケーションの設定情報をグローバル変数として定義し、各部分で参照するなどでは良い活用方法です。
// グローバル変数の定義 var language = "ja"; var themeColor = "blue"; // グローバル変数の利用 function greet() { if (language === "ja") { console.log("こんにちは"); } else { console.log("Hello"); } } greet(); // 出力: こんにちは
グローバル変数の弊害
多くのロジックでグローバル変数を参照して値を変更していると、どこで、どのタイミングで値が書き換わったのか把握が非常に困難になります。
グローバル変数を参照しているロジックに変更が入りそうなら、ほかにグローバル変数を参照しているロジックにバグが生じないか、慎重に検討しなければいけません。
グローバル変数の多用は可読性や保守性の低下につながる可能性があります。適切なスコープ内で変数を定義することが重要です。
参考
続く…
コメント
本記事の内容は以上になります!
書籍の続きのアウトプットも随時更新したいと思います。
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。