0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go 言語を学ぶAdvent Calendar 2023

Day 21

【Go言語】アプリケーションドメインに特化した定義型の作成

Posted at

Go言語での定義型の作成は、アプリケーション固有のドメインロジックを効率的に扱うための重要な技術である。
関心事を分離し、コードの凝集度を高めることができる。

スライスへの型定義

スライスに対する型定義は、コードの見通しを良くし、ユニットテストを容易にするという利点がある。
例えば、特定の条件を満たす要素のみを抽出するメソッドを定義型に追加することができる。

package main

import (
	"fmt"
)

// Consumer 型の定義
type Consumer struct {
	Name      string
	ActiveFlg bool
}

// Consumers 型の定義
type Consumers []Consumer

// ActiveConsumer メソッドの定義
func (c Consumers) ActiveConsumer() Consumers {
	var resp Consumers
	for _, v := range c {
		if v.ActiveFlg {
			resp = append(resp, v)
		}
	}
	return resp
}

func main() {
	consumers := Consumers{
		{Name: "Alice", ActiveFlg: true},
		{Name: "Bob", ActiveFlg: false},
		{Name: "Charlie", ActiveFlg: true},
	}

	activeConsumers := consumers.ActiveConsumer()
	fmt.Println("Active Consumers:", activeConsumers)
}

値への型定義

個々のデータ要素に対して型定義を行うこともできる。
これにより、特定の値に特有のロジックを組み込むことが可能になり、バリューオブジェクトのような実装が可能になる。

package main

import (
	"fmt"
)

// SKUCode 型の定義
type SKUCode string

// SKUCode 型のメソッド定義
func (c SKUCode) ItemCD() string {
	return string(c)[0:5]
}

func main() {
	var sku SKUCode = "T0123010102"
	itemCD := sku.ItemCD()
	fmt.Println("Item Code:", itemCD)
}

列挙への型定義

列挙型のようなデータに対しても、Goでは特定の処理をレシーバーとして追加することができる。
これにより、特定の条件に基づく複雑なロジックを効率的に処理できるようになります。

package main

import (
	"fmt"
)

// Season 型の定義
type Season int

const (
	Peak Season = iota + 1
	Normal
	Off
)

// Season 型のメソッド定義
func (s Season) Price(price float64) float64 {
	if s == Peak {
		return price + 200
	}
	return price
}

func main() {
	var currentSeason Season = Peak
	price := currentSeason.Price(1000)
	fmt.Println("Price:", price)
}

構造体への型定義

構造体に対して型定義を行うことも一般的。
構造体のフィールドやメソッドを通じて、より洗練されたデータ操作を実現することができる。

package main

import (
	"fmt"
)

// SensorData 型の定義
type SensorData struct {
	SensorType string
	Value      float32
}

// SensorData 型のメソッド定義
func (r SensorData) ReadValue() float32 {
	if r.SensorType == "Fahrenheit" {
		return (r.Value - 32) * 5 / 9 // 華氏を摂氏に変換
	}
	return r.Value
}

func main() {
	sensor := SensorData{SensorType: "Fahrenheit", Value: 86}
	value := sensor.ReadValue()
	fmt.Println("Temperature:", value, "°C")
}

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?