Найти тему
TechLead Insights

Clean Code: Искусство создания чистых методов (Часть 2)

Одним из ключевых аспектов чистого кода является написание "правильных" методов. Правильно спроектированные методы делают код более читабельным, поддерживаемым и простым для тестирования. Для себя я выделил 9 основных принципов написания качественных методов.


1. Понятные Имена
Используйте осмысленные и самодокументирующиеся имена методов, которые отражают их назначение.
Плохо:
public void DoStuff()
{
// Логика метода
}
Хорошо:
public void CalculateMonthlyRevenue()
{
// Логика расчета ежемесячного дохода
}

2. Минимизируйте Количество Параметров
Старайтесь, чтобы методы имели не более трех параметров. Если требуется больше, рассмотрите возможность объединения параметров в объект.
Плохо:
public void Configure(string host, int port, string username, string password)
{
// Логика настройки
}

Хорошо:
public void Configure(ConnectionSettings settings)
{
// Логика настройки
}

3. Один Метод— Одно Действие
Метод должен выполнять только одну задачу и делать это хорошо. Это упрощает понимание ее назначения и облегчает отладку.
Плохо:
public void ProcessData()
{
FetchData();
TransformData();
SaveData();
SendNotification();
}

Хорошо:
public void FetchData()
{
// Логика получения данных
}

public void TransformData()
{
// Логика преобразования данных
}

public void SaveData()
{
// Логика сохранения данных
}

public void SendNotification()
{
// Логика отправки уведомления
}

4. Избегайте Побочных Эффектов
Методы не должны изменять состояние внешних по отношению к ним объектов или глобальных переменных без явной необходимости.
Плохо:
public int IncrementCounter()
{
globalCounter++;
return globalCounter;
}

Хорошо:
public int Increment(int value)
{
return value + 1;
}

5. Обработка Исключений
Методы недолжны корректно обрабатывать возможные исключения и предоставлять полезную информацию для отладки.
Плохо:
public void OpenFile(string path)
{
var file = File.OpenRead(path);
// Работа с файлом
}

Хорошо:
public void OpenFile(string path)
{
if (!File.Exists(path))
{
throw new FileNotFoundException($"Файл {path} не найден.");
}

try
{
var file = File.OpenRead(path);
// Работа с файлом
}
catch (IOException ex)
{
// Логирование ошибки
throw new ApplicationException("Ошибка при открытии файла.", ex);
}
}

6. DRY (Don't Repeat Yourself)
Избегайте дублирования кода, вынося повторяющиеся части в отдельные методы.

Плохо:
public void SendWelcomeEmail(User user)
{
var smtpClient = new SmtpClient();
smtpClient.Send(user.Email, "Добро пожаловать!", "Спасибо за регистрацию.");
}

public void SendPasswordResetEmail(User user)
{
var smtpClient = new SmtpClient();
smtpClient.Send(user.Email, "Сброс пароля", "Инструкции по сбросу пароля.");
}

Хорошо:
public void SendEmail(string email, string subject, string body)
{
var smtpClient = new SmtpClient();
smtpClient.Send(email, subject, body);
}

public void SendWelcomeEmail(User user)
{
SendEmail(user.Email, "Добро пожаловать!", "Спасибо за регистрацию.");
}

public void SendPasswordResetEmail(User user)
{
SendEmail(user.Email, "Сброс пароля", "Инструкции по сбросу пароля.");
}

7. Читаемость и Форматирование
Код внутри метода должен быть отформатирован и организован так, чтобы его было легко читать и понимать.

Используйте отступы и пустые строки для разделения логических блоков.
Не злоупотребляйте вложенностью условий и циклов.
Разбивайте сложные выражения на простые.

8. Комментарии и Документация
Если метод выполняет сложную или неочевидную логику, снабдите ее кратким комментарием или XML-документацией.

/// <summary>
/// Расчитывает коэффициент корреляции Пирсона между двумя наборами данных.
/// </summary>
/// <param name="dataSetX">Первый набор данных.</param>
/// <param name="dataSetY">Второй набор данных.</param>
/// <returns>Коэффициент корреляции от -1 до 1.</returns>
public double CalculatePearsonCorrelation(double[] dataSetX, double[] dataSetY)
{
// Логика расчета
}


9. Используйте Чистые Функции
Чистые функции не зависят от внешнего состояния и не изменяют его. Они всегда возвращают один и тот же результат при одних и тех же входных данных.


Плохо:
int multiplier = 2;

public int Multiply(int value)
{
return value * multiplier;
}

Хорошо:
public int Multiply(int value, int multiplier)
{
return value * multiplier;
}

Clean Code: Чистый Код, Чистые Имена: Практическое руководство по именованию (Часть 1)