Вопрос о том, как назвать два метода с идентичной сигнатурой, из которых один может выбрасывать исключение, действительно может вызвать некоторые трудности в дизайне API. Основная цель — сделать код понятным и предсказуемым для пользователей. Вот несколько подходов и предложений по именованию:
### 1. Использование префиксов или суффиксов
Можно использовать префиксы или суффиксы в названиях методов, чтобы различать их:
- `TryMethodName` — метод, который не выбрасывает исключений, а возвращает результат в виде булевого значения или специального объекта (например, `Tuple` или `Result`), что сигнализирует об успешности выполнения.
- `MethodName` — метод, который может выбрасывать исключение.
```csharp
public bool TryParse(string input, out Result result) { ... }
public Result Parse(string input) { ... }
```
### 2. Названия, указывающие на исключения
Можно использовать названия, которые прямо указывают на возможность выбрасывания исключений:
- `MethodNameSafe` — для безопасной версии метода, которая не выбрасывает исключения.
- `MethodName` — для версии метода, которая может выбросить исключение.
```csharp
public Result ParseSafe(string input) { ... }
public Result Parse(string input) { ... }
```
### 3. Исключение в документации
Одним из подходов может быть также использование одного метода и четкая документация, что он может выбрасывать исключение. Это может быть более предпочтительным, если нет необходимости в отдельной безопасной версии метода.
### 4. Использование оберток
Можно обернуть метод, который может выбрасывать исключение, в другой метод, который будет обрабатывать исключения и возвращать безопасный результат:
```csharp
public Result HandleParse(string input) {
try {
return Parse(input);
} catch (SomeException e) {
// обработка
return default(Result);
}
}
```
### Заключение
Выбор способа именования и архитектуры будет зависеть от конкретных требований вашего приложения и предпочтений команды. Основная цель — сделать интерфейс интуитивно понятным и предсказуемым для пользователей.