際際滷

際際滷Share a Scribd company logo
どこに採を慕くのか?
徭失B初
twitter
pospome
iみ圭
ポスポメ
N
サ`バサイドエンジニア
d龍
クラスO畠違, DDD
ここらxの室gにd龍ある圭は
  フォロ`してくださると耙しいです
コ`ド個鋲ということで、
徭蛍がリファクタリング、レビュ`で嶷泣議に
_JしているところをB初
徭蛍が_Jするのは仝どこに採を慕くのか?々という泣
どこに?
?レイヤ
?パッケ`ジ
?クラス
?v方
採をくのか?
?採かしらの醤悶議なロジック
  ex. ユ`ザ`鞠hのバリデ`ションロジック
もう富し醤悶議に冱うと參和になる
?そのロジックはそこにあっていいのか?
?云栖あるべきパッケ`ジ、クラスがないのではないか?
箭えば
仝ユ`ザ`鞠hのバリデ`ションロジック々が
斌瞳クラスにあるのはおかしい
ユ`ザ`クラスにあるべきでは?
みたいなところを_Jする
なぜそういった泣を鳩範するのか?
あるべきところにコ`ドがない
◎
碧とg廾が行xしている
or
パッケ`ジ、クラスの佞景寄晒している
◎
辛i來が詰くなり、メンテナンス來が和がる辛嬬來がある
◎
ビジネスの撹Lスピ`ドに
コ`ドの撹Lがついていけなくなる
箭
ソ`シャルゲ`ムにおけるユ`ザ`の好珍Δ林麻
廣吭泣
?圷?ソ`シャルゲ`ム恬ってたので、
 こ`ゆ`狼の箭しか房いつきません???
?書指はクラスを鵑釦h苧します
?コ`ドは golang でいているので、
 屎_には class ではなく、struct なのですが、
 まあ、寄悶匯wなのでiみ紋えて和さい。
type User struct {
Attack int //好珍
}
func main() {
u := User{
Attack: 100,
}
//好珍Δ int の Attack に岱方を紗麻したものになる
rand.Seed(time.Now().UnixNano())
u.Attack = u.Attack + rand.Intn(10)
fmt.Println(u.Attack)
}
type User struct {
Attack int //好珍
}
func main() {
u := User{
Attack: 100,
}
//好珍Δ int の Attack に岱方を紗麻したものになる
rand.Seed(time.Now().UnixNano())
u.Attack = u.Attack + rand.Intn(10)
fmt.Println(u.Attack)
}
好珍τ麻のロジックが
Attack と鏡羨して砿尖されている
麿の侭で揖じように好珍τ麻をしたいrに
ロジックが嶷}する辛嬬來がある
箭坤丱薀鵐衡{屁のシミュレ`タ`
  _kで旋喘するデバッグC嬬など
好珍τ麻のロジックと Attack を匯wに砿尖してみる
type User struct {
Attack int //好珍
}
func (u User) GetAttack() int {
rand.Seed(time.Now().UnixNano())
return u.Attack + rand.Intn(10)
}
func main() {
u := User{
Attack: 100,
}
fmt.Println(u.GetAttack())
}
User に GetAttack() を隔たせることで、
Attack と好珍τ麻のロジックが械に匯wになる
User が贋壓すれば、
械に好珍τ麻が辛嬬になる
これで或悪?
type User struct {
HP, Attack, Defense int
Job string
Condition int
}
枠殻の俐屎でもよさそうだが、
ユ`ザ`は好珍Δ遼にも奉來を隔つ並が謹い
User がロジックを隔ってしまうと、
光奉來にvするI尖を畠て User が隔つことになる
User クラスの佞どんどん景寄晒してしまう
醤悶議なロジックを User クラスが隔つ駅勣はないのでは?
type User struct {
Attack Attack //ここがポイント
}
func (u User) GetAttack() int {
return u.Attack.GetPoint()
}
type Attack struct {
Point int
}
func (a Attack) GetPoint() int {
rand.Seed(time.Now().UnixNano())
return a.Point + rand.Intn(10)
}
func main() {
u := User{
Attack: Attack{
Point: 100,
},
}
fmt.Println(u.GetAttack())
}
Attack を int ではなく、
オブジェクトと彌える
Attack 徭悶にロジックを隔たせる
User は Attack.GetPoint() を柵ぶだけ
醤悶議なロジックは岑らない
好珍τ麻ロジックを Attack にg廾することにより、
User クラスからその佞なくなった
これにより User クラスの佞
景寄晒する辛嬬來は詰くなるはず
Attack.GetPoint() をデリゲ`トしているので蹄鹿業は詰いですが???
さらに、好弔哩vする碧筝は Attack という
より醤悶議なオブジェクトへの俐屎に浙┐気譴
△吠篩Δある栽、
Defense という醤悶議なオブジェクトへの俐屎に
浙┐気譴襪呂
User が岷俊ロジックを隔っている栽、
好珍Α∧篩Δ覆 User が隔つ畠ての奉來にする俐屎は
畠て User への俐屎になってしまう
m俳な佞侶幃xができているとはいいyい
方」int である 好珍ΓAttack を
わざわざオブジェクトでQうのはおかしい
方、 int で燕Fした圭がいい
と房う繁がいるかもしれない???
gはこれが書晩のポイント
?そのロジックはそこにあっていいのか?
?云栖あるべきパッケ`ジ、クラスがないのではないか?
◎
?好珍τ麻ロジックを User に崔いていいのか?
?云栖あるべき Attack クラスが贋壓しないために
 User に崔いてるだけではないのか?
レビュ`、リファクタリングには
こういったQ泣で麗並を深える
ここで枠殻のg廾に
仝イベントのNによって好珍τ麻ロジックが笋錣襦
という碧を弖紗してみる
type User struct {
Attack Attack //好珍
}
func (u User) GetAttack() int {
return u.Attack.GetPoint()
}
好珍τ麻ロジックは Attack クラスが隔っているので、
User クラスは笋錣蕕覆
type Attack struct {
Point int
AttackLogic AttackLogic
}
func (a Attack) GetPoint() int {
rand.Seed(time.Now().UnixNano())
return a.Point + rand.Intn(10) + a.AttackLogic.Calc()
}
type AttackLogic interface {
Calc() int
}
type XxxEvent struct {
Point int
}
func (x XxxEvent) Calc() int {
//Xxx というイベントでは好珍Δ2蔚になる
return x.Point * 2
}
AttackLogic interface を仟ラ撹
AttackLogic を困燭好ラスを
Attack にセットすれば、
朕議に栽った好珍τ麻が辛嬬になる
書指は Xxxイベント というイベント喘の
AttackLogic を喘吭している
func main() {
point := 100
u := User{
Attack: Attack{
Point: point,
AttackLogic: XxxEvent {
Point: point,
},
},
}
fmt.Println(u.GetAttack())
}
AttackLogic の砿尖圭隈はちゃんと深える駅勣があるが、
rgないので護
このようなロジックを User に隔たせると仭くなる
と房いませんか?
碧弖紗がMむと、どんどん仭くなります
そして、
このg廾を宥じて參和であることが蛍かる
Attack ´ 好弔魃蹶Fするオブジェクト
Attack.Point ´ 好珍Δ魃蹶Fする int
gは Attack は好珍Δ離ブジェクトではなく、
仝好帖垢箸いΩ田遒鬟ブジェクトにしている
好珍Δ任△ Attack.Point はY蕉 int
?そのロジックはそこにあっていいのか?
?云栖あるべきパッケ`ジ、クラスがないのではないか?
◎
?好珍τ麻ロジックを User に崔いていいのか?
?云栖あるべき Attack クラスが贋壓しないために
 User に崔いてるだけではないのか?
◎
?仝好珍Α垢箸eに仝好帖垢魃蹶Fするオブジェクトが
 贋壓しないのではないか?
?好弔塙珍Δe?の古廷としてQうことで
 佞鬚呂辰りさせる
まとめ
書指の箭であれば、
Attack は int のままでもいいかもしれない
ただ、それはど`でもいい
書指擦┐燭ったのは仝屎盾々ではなく仝xk岔々
Oの屎盾を協xするのはyしい
どこに採を慕くのか? をしっかりと深えて、
徭蛍なりに屎しいxkをして圀しい
仝Shadowverse_k並箭々?胆カ`ドが咾! 崙恬テク
ニックのすべて?
https://speakerdeck.com/cygames/shadowversekai-fa-shi-li-mei-li-
カ`ドにvするクラスが60參貧らしい
クラスが謹い = }j
と深えるかもしれないが、
クラスを富なくしてもY蕉駅勣なロジックは揖じ
富ないクラスに寄楚のロジックをくのか?
寄楚のクラスに玉いロジックをくのか?
この`いでしかない
富ないクラスに寄楚のロジックを融っzむと
訳周蛍瓷が謹kし、仭くなる辛嬬來が互い
かく蛍けることによって
旋喘する箸Mみ栽わせられるので、
壅旋喘來が互くなる
いかに弌さくて吭龍のあるクラスをつけるかがポイント
書指の箭では仝クラス々を函り貧げましたが、
レイヤ、パッケ`ジ、v方についても
揖じようなQ泣で深える駅勣があります
そのロジックはそこにあっていいのか?
という夘を械に隔ってコ`ドの|を貧げていきましょう
おわり

More Related Content

と?こに採を慕くのか?