Golang实现Gilded Rose Kata的示例与解析

Golang实现Gilded Rose Kata的示例与解析 鉴于Go语言没有类,是否有人完成了Gilded Rose Kata的代码库?

我已经做到了使用switch语句,但不确定接下来该怎么做。

我之所以这样问,是因为在观看Sandi Metz用Ruby完成这个Kata时,她在视频的最后部分使用了类——https://youtu.be/8bZh5LMaSmE。还需要进行哪些额外的重构?

重构Kata的规则在https://kata-log.rocks/gilded-rose-kata,Go语言的起始文件在https://github.com/emilybache/GildedRose-Refactoring-Kata

谢谢

package main

type Item struct {
	name    string
	sellIn  int
	quality int
}

func UpdateQuality(items []*Item) {
	for i := 0; i < len(items); i++ {

	item := items[i]

	switch item.name {
	case "+5 Dexterity Vest", "Elixir of the Mongoose":
		Normal(item)

	case "Conjured Mana Cake":
		Conjured(item)

	case "Aged Brie":
		AgedBrie(item)

	case "Backstage passes to a TAFKAL80ETC concert":
	    	Backstage(item)

    	   default:
		break
	}
}
}

func Normal(item *Item) {
if item.sellIn > 0 {
	item.quality -= 1
}
if item.sellIn <= 0 {
	item.quality -= 2
}
item.sellIn -= 1
}
func Backstage(item *Item) {
if item.sellIn <= 5 && item.quality >= 50 {
	item.quality += 3
}
if item.sellIn <= 10 && item.quality >= 50 {
	item.quality += 2
}
item.sellIn -= 1
item.quality += 1
if item.sellIn == 0 {
	item.quality = 0
}
}


func AgedBrie(item *Item) {
item.sellIn -= 1
item.quality += 1
}

func Conjured(item *Item) {
item.quality -= 2
item.sellIn -= 1
}

更多关于Golang实现Gilded Rose Kata的示例与解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang实现Gilded Rose Kata的示例与解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


package main

// Item 结构体保持不变
type Item struct {
	name    string
	sellIn  int
	quality int
}

// 定义物品行为接口
type ItemBehavior interface {
	Update()
	GetItem() *Item
}

// 基础物品类型
type BaseItem struct {
	item *Item
}

func (b *BaseItem) GetItem() *Item {
	return b.item
}

// 普通物品
type NormalItem struct {
	BaseItem
}

func NewNormalItem(item *Item) *NormalItem {
	return &NormalItem{BaseItem{item: item}}
}

func (n *NormalItem) Update() {
	item := n.item
	if item.quality > 0 {
		item.quality--
	}
	item.sellIn--
	if item.sellIn < 0 && item.quality > 0 {
		item.quality--
	}
}

// 陈年布利奶酪
type AgedBrieItem struct {
	BaseItem
}

func NewAgedBrieItem(item *Item) *AgedBrieItem {
	return &AgedBrieItem{BaseItem{item: item}}
}

func (a *AgedBrieItem) Update() {
	item := a.item
	if item.quality < 50 {
		item.quality++
	}
	item.sellIn--
	if item.sellIn < 0 && item.quality < 50 {
		item.quality++
	}
}

// 后台通行证
type BackstagePassItem struct {
	BaseItem
}

func NewBackstagePassItem(item *Item) *BackstagePassItem {
	return &BackstagePassItem{BaseItem{item: item}}
}

func (b *BackstagePassItem) Update() {
	item := b.item
	if item.quality < 50 {
		item.quality++
		if item.sellIn < 11 && item.quality < 50 {
			item.quality++
		}
		if item.sellIn < 6 && item.quality < 50 {
			item.quality++
		}
	}
	item.sellIn--
	if item.sellIn < 0 {
		item.quality = 0
	}
}

// 魔法物品
type ConjuredItem struct {
	BaseItem
}

func NewConjuredItem(item *Item) *ConjuredItem {
	return &ConjuredItem{BaseItem{item: item}}
}

func (c *ConjuredItem) Update() {
	item := c.item
	if item.quality > 0 {
		item.quality -= 2
		if item.quality < 0 {
			item.quality = 0
		}
	}
	item.sellIn--
	if item.sellIn < 0 && item.quality > 0 {
		item.quality -= 2
		if item.quality < 0 {
			item.quality = 0
		}
	}
}

// 物品工厂
func CreateItemBehavior(item *Item) ItemBehavior {
	switch item.name {
	case "Aged Brie":
		return NewAgedBrieItem(item)
	case "Backstage passes to a TAFKAL80ETC concert":
		return NewBackstagePassItem(item)
	case "Conjured Mana Cake":
		return NewConjuredItem(item)
	case "+5 Dexterity Vest", "Elixir of the Mongoose":
		return NewNormalItem(item)
	default:
		return NewNormalItem(item)
	}
}

// 更新品质的主函数
func UpdateQuality(items []*Item) {
	for _, item := range items {
		itemBehavior := CreateItemBehavior(item)
		itemBehavior.Update()
	}
}

// 测试示例
func main() {
	items := []*Item{
		{"+5 Dexterity Vest", 10, 20},
		{"Aged Brie", 2, 0},
		{"Elixir of the Mongoose", 5, 7},
		{"Backstage passes to a TAFKAL80ETC concert", 15, 20},
		{"Conjured Mana Cake", 3, 6},
	}
	
	UpdateQuality(items)
}

这个实现使用了Go的接口来模拟面向对象的多态行为。每个物品类型都实现了ItemBehavior接口,通过工厂模式创建具体的物品对象。这样避免了复杂的switch语句,使代码更易于扩展和维护。

回到顶部