Value Object

Предыдущий урок Следующий урок

type Color struct {
	red   uint8
	green uint8
	blue  uint8
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}

func NewColor(red uint8, green uint8, blue uint8) Color {
	// Валидация параметров происходит естественным образом через тип uint8 (диапазон 0–255)
	// Поэтому тут ее нет
	color := Color{
		red:   red,
		green: green,
		blue:  blue,

		valid: true,
	}
	return color
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}

func NewColor(red uint8, green uint8, blue uint8) Color {
	// Валидация параметров происходит естественным образом через тип uint8 (диапазон 0–255)
	// Поэтому тут ее нет
	color := Color{
		red:   red,
		green: green,
		blue:  blue,

		valid: true,
	}
	return color
}

func White() Color {
	color := NewColor(255, 255, 255)
	return color
}

func Black() Color {
	color := NewColor(0, 0, 0)
	return color
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}

func NewColor(red uint8, green uint8, blue uint8) Color {
	// Валидация параметров происходит естественным образом через тип uint8 (диапазон 0–255)
	// Поэтому тут ее нет
	color := Color{
		red:   red,
		green: green,
		blue:  blue,

		valid: true,
	}
	return color
}

func White() Color {
	color := NewColor(255, 255, 255)
	return color
}

func Black() Color {
	color := NewColor(0, 0, 0)
	return color
}

func (c Color) Equals(other Color) bool {
	return c == other
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}

func NewColor(red uint8, green uint8, blue uint8) Color {
	// Валидация параметров происходит естественным образом через тип uint8 (диапазон 0–255)
	// Поэтому тут ее нет
	color := Color{
		red:   red,
		green: green,
		blue:  blue,

		valid: true,
	}
	return color
}

func White() Color {
	color := NewColor(255, 255, 255)
	return color
}

func Black() Color {
	color := NewColor(0, 0, 0)
	return color
}

func (c Color) Equals(other Color) bool {
	return c == other
}

func (c Color) IsValid() bool {
	return c.valid
}

func (c Color) Blend(other Color) (Color, error) {
	if !other.IsValid() {
		return Color{}, errs.NewValueIsRequiredError("other")
	}
	return NewColor(
		(c.red+other.red)/2,
		(c.green+other.green)/2,
		(c.blue+other.blue)/2,
	), nil
}
  

type Color struct {
	red   uint8
	green uint8
	blue  uint8

	valid bool
}

func (c Color) Red() uint8 {
	return c.red
}

func (c Color) Green() uint8 {
	return c.green
}

func (c Color) Blue() uint8 {
	return c.blue
}

func NewColor(red uint8, green uint8, blue uint8) Color {
	// Валидация параметров происходит естественным образом через тип uint8 (диапазон 0–255)
	// Поэтому тут ее нет
	color := Color{
		red:   red,
		green: green,
		blue:  blue,

		valid: true,
	}
	return color
}

func White() Color {
	color := NewColor(255, 255, 255)
	return color
}

func Black() Color {
	color := NewColor(0, 0, 0)
	return color
}

func (c Color) Equals(other Color) bool {
	return c == other
}

func (c Color) IsValid() bool {
	return c.valid
}

func (c Color) Blend(other Color) (Color, error) {
	if !other.IsValid() {
		return Color{}, errs.NewValueIsRequiredError("other")
	}
	return NewColor(
		(c.red+other.red)/2,
		(c.green+other.green)/2,
		(c.blue+other.blue)/2,
	), nil
}

func (c Color) String() string {
	return fmt.Sprintf("%v, %v, %v\n", c.red, c.green, c.blue)
}
  

	color1 := color.Color{}
	println(color1.String())
  

	color2 := color.Color{red: 0, green: 0, blue: 0}
  

	color3 := color.NewColor(-1, -1, -1)
  

	color4 := color.NewColor(255, 255, 255)
	color4.r = 125
  

	color5, err := color3.Blend(color.Color{})
	errs.CheckIfError(err)
  

	color6 := color.NewColor(255, 255, 255)
  

	black := color.Black()
	white := color.White()
	isEqual := black.Equals(white)
	println("Is black equal white: ", isEqual)
  

	blendedColor, err := black.Blend(white)
	if err != nil {
		log.Fatal(err)
	}
	println("Blended color is: ", blendedColor.String())