Пример рефакторинга «выделение функции» при рендеринге изображения


Исходный код

func Pic(dx, dy int) [][]uint8 {
	picture := make([][]uint8, dy, dy)
	for y := 0; y < dy; y++ {
		picture[y] = make([]uint8, dx, dx)
		for x := 0; x < dx; x++ {
			picture[y][x] = uint8(x)
		}
	}
	return picture
}

Что не так в исходном коде

Эта функция — моё решение упражнения из тура по Go. Несмотря на то, что этот код написан мной, он не соответствует моему же канону. Здесь одна функция решает две задачи: выделить память под изображение и собственно отрендерить изображение.

Как лучше распределить ответственности

func AllocatePicture(dx, dy int) [][]uint8 {
	picture := make([][]uint8, dy, dy)
	for y := 0; y < dy; y++ {
		picture[y] = make([]uint8, dx, dx)
	}
	return picture
}

func RenderPicture(picture [][]uint8) {
	for y := 0; y < len(picture); y++ {
		for x := 0; x < len(picture[y]); x++ {
			picture[y][x] = uint8(x)
		}
	}
}

Теория