Я написал / пишу фрагмент кода для анализа физики, первоначально для себя, который, надеюсь, теперь будет использоваться и расширяться небольшой группой физиков.Никто из нас не является гуру C ++.Я собрал небольшую структуру, которая абстрагирует данные о «физическом событии» в объекты, на которые воздействует цепочка инструментов, которые можно легко переключать в зависимости от требований анализа.
Это создало две половины длякод: код «физический анализ», который управляет объектами события и производит наши результаты через производные от базового «инструмента»;и «структурный» код, который присоединяет входные файлы, разбивает задание на параллельные запуски, связывает инструменты в цепочку согласно некоторому сценарию и т. д.
Проблема заключается в следующем: чтобы другие могли использовать этот кодВажно, чтобы каждый пользователь мог выполнять каждый шаг, который каким-либо образом изменяет данные события.Поэтому (многие) дополнительные строки сложного структурного кода могут быть пугающими, если только они явно и явно не являются периферийными для физики.Хуже того, слишком детальное рассмотрение этого может дать людям идеи - и я бы предпочел, чтобы они не редактировали структурный код без очень веских причин - и самое главное, они не должны вводить ничего, что влияет на физику.
Я хотел бы иметь возможность:
- A) очевидным образом продемонстрировать, что структурный код не редактирует данные события каким-либо образом
- B) принудительно применить это еще разпользователи начинают расширять код сами (никто из нас не является экспертом, и физика всегда на первом месте - перевод: все, что не получено, является честной игрой для грязного взлома)
В моем идеальном сценарии данные о событияхбудет закрытым, а производные физические инструменты наследуют доступ от базового класса Tool.Конечно, в действительности это не разрешено.Я слышал, что для этого есть веские причины, но это не проблема.
К сожалению, в этом случае метод вызова получателей / установщиков из базы (который является другом) создаст больше проблем, чем решит -код должен быть максимально чистым, легким для понимания и максимально связанным с физикой при реализации самого инструмента (пользователю не нужно быть экспертом ни в C ++, ни во внутренней работе программы, чтобы создатьинструмент).
Учитывая, что у меня есть надежный базовый класс, и любые производные будут подлежать тщательному анализу, есть ли другой обходной, но хорошо проверенный способ предоставления доступа только к этим производным?Или какой-либо способ запрета доступа к производным какой-то другой базы?
Чтобы прояснить ситуацию, у меня есть что-то вроде
class Event
{
// The event data (particle collections etc)
};
class Tool
{
public:
virtual bool apply(Event* ev) = 0;
};
class ExampleTool : public Tool
{
public:
bool apply(Event* ev)
{
// do something like loop over the electron collection
// and throw away those will low energy
}
};
Идеальным было бы ограничение доступа к содержимомуСобытия только для этих инструментов по двум причинам (A и B) выше.
Спасибо всем за предложенные решения.Я думаю, что, как я и подозревал, идеальное решение, о котором я мечтал, невозможно.Решение dribeas было бы идеальным в любой другой ситуации, но именно в функции apply () код должен быть как можно более четким и лаконичным, поскольку мы будем в основном тратить весь день на написание / редактирование функций apply (), а такженужно понимать каждую строчку из них написанную каждым из остальных.Дело не столько в способностях, сколько в удобочитаемости и усилиях.Мне нравится препроцессорное решение от «Бесполезного».Это на самом деле не навязывает разделение, но кто-то должен быть действительно злым, чтобы сломать его.Для тех, кто предложил библиотеку, я думаю, что это, безусловно, будет хорошим первым шагом, но на самом деле не решает две основные проблемы (так как мне все равно нужно будет предоставить источник).