Но в этом случае возникает два больших вопроса:
1. Как рефакторить такой код.
2. Как вести версионый контроль.
Одно из возможных решений – писать серверные методы на клиенте с последующей копированием методов на сервер. Так как мы пишем весь код на клиенте, то проблем с рефакторингом и версионным контролем не будет.
Скопируем на сервер все методы которые находятся в категориях с названием ‘server methods’
filter := MethodCollector new protocol: 'server methods1'. methodDefinitions := (MethodCollector new select: filter). methodDefinitions do: [:each | "Копируем метод на сервер" each implementingClass compileMethodAt: each selector inGSSession: GBSM currentSession failedMethods: nil].При компиляции на сервере возможны ошибки. Хорошо бы увидеть все методы которые не прошли компиляцию.
failedMethods := OrderedCollection new. filter := MethodCollector new protocol: 'server methods1'. methodDefinitions := (MethodCollector new select: filter). methodDefinitions do: [:each | each implementingClass compileMethodAt: each selector inGSSession: GBSM currentSession failedMethods: failedMethods]. failedMethods isEmpty ifFalse: ["Открывается окно со списком методов не прошедших компиляцию с указанием причин" GbxMethodListBrowser openListBrowserOn: failedMethods label: 'Methods failing compilation' session: GBSM currentSession]Выбирать методы для копирования на сервер можно по разному. Например я пользуюсь таким способом. В каждом методе который будет копироваться на сервер вызываю метод serverMethod. serverMethod ничего не делает – это просто метка которая говорит о том что метод будет копироваться на сервер. Тогда фильтр будет выглядеть так:
filter := MethodCollector new referencesTo: #serverMethod.
Такой подход для меня предпочтительный, так как не надо загонять все копируемые методы в один протокол.
Также можно использовать другие фильтры и соединять фильтры с помощью And и Or. Более подробно рассказано в комментариях к классу MethodFilter.