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语句,使代码更易于扩展和维护。

