Skip to content

Latest commit

 

History

History
179 lines (147 loc) · 6.78 KB

File metadata and controls

179 lines (147 loc) · 6.78 KB

Проверка кода:

package bad

import (
	"strings"
	"strconv"
)

func startWith(in, test string) bool {
	if len(test) > len(in) {
		return false
	}

	i := 0
	for range test {
		if test[i] != in[i] {
			return false
		}
		i++
	}

	return true
}

func Line(in string) (string, string) {
	if len(in) == 0 {
		return "", ""
	}

	i := strings.Index(in, stringEmpty)

	if i == -1 {
		return in[1:], ""
	}

	return in[1:i], in[i+1:]
}

func extractFlightLevel(in string) int {
	fl, _ := strconv.Atoi(in[1:])
	return fl
}

Ваш код в целом хорош, но есть несколько мест, где можно сделать его более идеоматичным для Go. Вот некоторые из них:

  1. Игнорирование ошибок: В функции extractFlightLevel, вы игнорируете ошибку, возвращаемую функцией strconv.Atoi. Это может привести к непредсказуемому поведению, если входная строка не может быть преобразована в число. Вместо этого, рекомендуется обрабатывать ошибки.
func extractFlightLevel(in string) (int, error) {
	fl, err := strconv.Atoi(in[1:])
	if err != nil {
		return 0, err
	}
	return fl, nil
}
  1. Использование ручного цикла для сравнения строк: В функции startWith, вы используете ручной цикл для сравнения строк. Вместо этого, вы можете использовать встроенную функцию strings.HasPrefix.
func startWith(in, test string) bool {
	return strings.HasPrefix(in, test)
}
  1. Неизвестная переменная: В функции Line, вы используете переменную stringEmpty, которая не определена в представленном коде. Кроме того, пустое значение "" вернёт 0, а не -1.
i := strings.Index(in, stringEmpty)
  1. Срезы строк: В функции Line, вы используете in[1:] для создания среза строки, начинающегося со второго символа. Если это преднамеренное действие, то все в порядке. Однако, если вы хотите вернуть всю строку, когда i == -1, вам следует использовать просто in, а не in[1:]. Т.к. индекс среза начинается с 0, а не с 1.
if i == -1 {
	return in, ""
}
  1. Требуются тесты: В функции Line неочевидная логика, тесты устраняют возможные ошибки или непредсказуемое поведение. Например:
func Line(in, stringEmpty string) (string, string) {
	if len(in) == 0 {
		return "", ""
	}
	if stringEmpty == "" {
		return in, ""
	}
	i := strings.Index(in, stringEmpty)
	if i == -1 {
		return in, ""
	}
	return in[:i], in[i+len(stringEmpty):]
}

func TestLine(t *testing.T) {
	tests := []struct {
		name  string
		in    string
		sep   string
		want1 string
		want2 string
	}{
		{
			name:  "Empty input",
			in:    "",
			sep:   "",
			want1: "",
			want2: "",
		},
		{
			name:  "No separator",
			in:    "Hello, world!",
			sep:   "",
			want1: "Hello, world!",
			want2: "",
		},
		{
			name:  "Multi separator",
			in:    "Hello, world!",
			sep:   "ll",
			want1: "He",
			want2: "o, world!",
		},
		{
			name:  "Separator at the start",
			in:    ",Hello, world!",
			sep:   ",",
			want1: "",
			want2: "Hello, world!",
		},
		{
			name:  "Separator in the middle",
			in:    "Hello, world!",
			sep:   ",",
			want1: "Hello",
			want2: " world!",
		},
		{
			name:  "Separator at the end",
			in:    "Hello, world!",
			sep:   "!",
			want1: "Hello, world",
			want2: "",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got1, got2 := Line(tt.in, tt.sep)
			if got1 != tt.want1 || got2 != tt.want2 {
				t.Errorf("Line() = (%v, %v), want (%v, %v)", got1, got2, tt.want1, tt.want2)
			}
		})
	}
}

Именование переменных и функций - это важная часть написания чистого и понятного кода. В Go есть некоторые общепринятые соглашения и рекомендации по именованию. Вот некоторые из них, которые могут быть применимы к вашему коду:

  1. Используйте короткие, описательные имена: В Go обычно рекомендуется использовать короткие имена переменных, особенно для локальных переменных и параметров. Например, вместо in и test в функции startWith вы можете использовать более описательные имена, такие как str и prefix.

  2. Используйте camelCase для имен переменных и функций: В Go обычно используется camelCase для имен переменных и функций. Например, startWith и extractFlightLevel хорошо соответствуют этому соглашению.

  3. Используйте имена, которые отражают тип и назначение переменной: Имя переменной должно отражать ее тип и то, что она представляет. Например, в функции extractFlightLevel имя переменной fl хорошо отражает то, что она представляет уровень полета.

  4. Используйте глаголы для имен функций: Имена функций обычно начинаются с глагола, отражающего то, что функция делает. Например, startWith и extractFlightLevel хорошо соответствуют этому соглашению.

  5. Избегайте сокращений и аббревиатур: Сокращения и аббревиатуры могут затруднить понимание кода. Лучше использовать полные слова, если это возможно.

В целом, ваш код уже хорошо соответствует этим рекомендациям. Однако всегда есть место для улучшения, и надеюсь, что эти советы будут полезны для вас.