Одним из ключевых аспектов чистого кода является написание "правильных" методов. Правильно спроектированные методы делают код более читабельным, поддерживаемым и простым для тестирования. Для себя я выделил 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)