Не зацикливайтесь на именах классов, это не единственный способ сделать чистый дизайн. Используйте имена методов, перегрузки методов, типы аргументов метода, имена аргументов метода, перегрузки конструктора, типы аргументов конструктора и так далее. Много инструментов на языке, чтобы помочь пользователю ваших классов.
Например, поскольку вы говорите о некоторых простых функциях, которые бы просто объединяли существующие классы, вы можете сделать их статическими методами на вспомогательном классе (вы можете даже сделать их методами расширения для класса Report, если хотите):
public static class ReportHelper
{
public static void SaveToFile(Report report, string path) {};
public static void Send(Report report, string address) {};
}
Если вы хотите немного абстрагироваться и поддерживать более сложные поведения, то правильное имя для объекта, инкапсулирующего поведения, будет Рабочий процесс .
public interface IReportAction
{
void Execute(Report report);
}
public class ReportWorkflow : IReportAction
{
//Composite pattern to keep a list of actions and execute them one by one
}
public class SendReportAction : IReportAction {}
public class WriteReportAction : IReportAction {}
Имея свой класс рабочего процесса, вы можете создать несколько его экземпляров и дать им некоторые бизнес-ориентированные имена. Например, какова роль рабочего процесса, в который вы отправляете отчет? Может быть, это EndOfDayReportWorkflow
, поэтому назовите его так, чтобы он мог отформатировать отчет, сделать что-то еще с ним и затем отправить. Вы избегаете дурных имен и будете кодировать в бизнес-терминах высокого уровня.