SODA Engineering Blog
😗

Go言語におけるコードの複雑性:マップを用いた三項演算子風の書き方は許容されるべきか?

2024/10/28に公開

こんにちは。FEチームのMapleです。私たちのチームは、現在のシステムアーキテクチャを見直し、Reactを用いた新しいアーキテクチャへの移行を検討しています。今回はGo言語においてマップを用いた三項演算子風の書き方は許容されるべきか?を書いてみました。

1. Go言語の設計哲学の振り返り

シンプルさと明快さの追求

  • Go言語は「シンプルさ」と「明快さ」を重視して設計
  • 冗長な構文や複雑な機能を排除し、読みやすく保守しやすいコードを書くことが奨励

明示的な条件分岐

  • Goでは、条件分岐において明示的なif-else文を使用することが一般的
  • コードの流れを明確にし、意図しない動作を防ぐ

2. マップを用いた三項演算子風の書き方

JavaScriptではしばしば三項演算子を使用するので、Goでも使用できるのではないかと思い以下のような記述をレビューに出しました。

map[bool]string{true: "hoge", false: "fuga"}[bool変数]

このコードは、bool変数の結果に基づいて、trueの場合は"hoge"、falseの場合は"fuga"を選択しています。

メリット

  • 条件分岐を一行で表現できるため、コード量を減らすことができる
  • 条件に基づく値の選択が明確に表現

デメリット

  • Goに不慣れな開発者にとっては直感的ではなく、理解しづらい
  • マップを使用することで、不要なメモリ消費や処理のオーバーヘッドが発生する可能性がある
  • Goは明示的でシンプルなコードを重視しており、このような短縮構文はその理念と一致しない

社内エンジニアの意見

  • 先程のコードをバックエンドエンジニアにレビュー頂いたところ、Goではあまり使用しない書き方なのでやめてほしい
  • 可読性が低下する

使用しないほうが良さそう

  • JavaScriptなどのフロントエンドではしばしば三項演算子を使用しますが、Goでは基本的に使用し内容が良さそうでした。

3. 代替手段

明示的なif-else文

  • 最も推奨される方法は、明示的なif-else文を使用することです。バックエンドエンジニアにもこちらの書き方に修正をお願いされました。
var name string
if bool変数 {
    name = "hoge"
} else {
    name = "fuga"
}

関数を利用したアプローチ

  • 条件分岐を関数に抽象化することで、コードの再利用性を高めつつ、可読性を維持することが可能です。
func getName(bool変数 bool) string {
    if bool変数 {
        return "hoge"
    }
    return "fuga"
}

name := getName(bool変数)

シンプルなコードの維持

  • Goでは、コードのシンプルさと明快さを維持することが最優先
  • 複雑なロジックや短縮構文は避け、明確な意図が伝わるコードを書くことが重要

4. まとめ

  • Go言語におけるコードの複雑性管理は、シンプルで明快な構文を維持することが鍵
  • マップを用いた三項演算子風の書き方は、一見簡潔に見えるものの、可読性やパフォーマンス、メンテナンス性の観点から慎重に検討する必要がある
  • 社内のバックエンドエンジニアの意見を踏まえ、明示的なif-else文を使用することで、コードの可読性と保守性を高めることが推奨
SODA Engineering Blog
SODA Engineering Blog

Discussion