Go言語の文字列操作設計パターン集!メンテナンス性の高いコード例
生徒
「Goで文字列操作をするとき、後から修正や拡張が簡単にできる書き方ってありますか?」
先生
「はい、設計パターンを意識してコードを書くことで、メンテナンス性の高い文字列操作が可能になります。特に関数の分割や抽象化、共通処理の切り出しがポイントです。」
生徒
「具体的にはどのようなパターンがありますか?」
先生
「それでは、基本的なパターンとサンプルコードを順に見ていきましょう!」
1. 共通関数に切り出すパターン
文字列操作を複数の場所で使う場合、共通関数として切り出すとコードの重複を減らせます。例えば、文字列の前後の空白を削除する処理を共通関数にします。
package main
import "strings"
func TrimSpaces(s string) string {
return strings.TrimSpace(s)
}
こうすることで、後から処理を変更する際も、この関数だけ修正すれば全体に反映されます。
2. 小さな処理に分けるパターン
一つの関数に多くの処理を書きすぎると、修正やテストが難しくなります。小さな処理ごとに関数を分けることで、テストや再利用が容易になります。
func ToUpperCase(s string) string {
return strings.ToUpper(s)
}
func RemoveHyphens(s string) string {
return strings.ReplaceAll(s, "-", "")
}
このように関数を分けることで、必要な処理だけ呼び出すことができ、柔軟に組み合わせられます。
3. インターフェースで抽象化するパターン
文字列操作の種類が増えても、共通のインターフェースを使うことで、処理の切り替えが簡単になります。
type StringProcessor interface {
Process(s string) string
}
type UpperProcessor struct{}
func (u UpperProcessor) Process(s string) string {
return strings.ToUpper(s)
}
type TrimProcessor struct{}
func (t TrimProcessor) Process(s string) string {
return strings.TrimSpace(s)
}
このようにすると、StringProcessorを使って統一的に文字列操作を呼び出せます。
4. パイプラインで処理を連結するパターン
複数の文字列操作を順番に実行する場合は、パイプライン形式で処理をつなぐと可読性が上がります。
func ProcessString(s string, processors ...StringProcessor) string {
for _, p := range processors {
s = p.Process(s)
}
return s
}
func main() {
text := " go-lang "
result := ProcessString(text, TrimProcessor{}, UpperProcessor{})
}
この方法だと、処理の順番を簡単に変えられ、追加の操作も柔軟に対応できます。
5. テストしやすい設計にするパターン
メンテナンス性を上げるためには、テストしやすい設計にすることも重要です。小さな関数に分割して、個別にテストできる構造にします。
func TestTrimSpaces(t *testing.T) {
input := " hello "
expected := "hello"
result := TrimSpaces(input)
if result != expected {
t.Errorf("期待値: %s, 実際: %s", expected, result)
}
}
関数が小さいほどテストが簡単になり、バグを早く発見できます。
6. データ駆動で汎用化するパターン
文字列操作のルールをデータとして管理すると、コードの変更を最小限に抑えられます。例えば、置換ルールをスライスで管理します。
var replacements = []struct{
old string
new string
}{
{"-", ""},
{"_", " "},
}
func ReplaceMultiple(s string) string {
for _, r := range replacements {
s = strings.ReplaceAll(s, r.old, r.new)
}
return s
}
この方法だと、新しい置換ルールを追加するだけでコードを修正せずに対応可能です。
7. メンテナンス性を意識した文字列操作設計のポイント
- 共通処理は関数に切り出して再利用する。
- 関数は小さく分割してテストしやすくする。
- インターフェースや抽象化で柔軟性を持たせる。
- パイプラインやデータ駆動で処理を連結・汎用化する。
- テスト可能な設計にすることで、後からの修正も安全。
これらのパターンを意識するだけで、Go言語での文字列操作がメンテナンス性の高いコードになります。