Реализовать одну и ту же модель предметной области в Python и C#. Что должно быть одинаковым и что должно отличаться?
В качестве хобби и передового опыта я выполняю одну и ту же модель предметной области (простая библиотека GPS / GIS, основанная на стандартах ISO 191xx и OGC Abstract Model) как в Python, так и в C#.
Сначала я подумал: "Хорошо, ISO/OGC дал мне готовый UML, поэтому у меня будет каждый класс в C# и в Python, имеющий одинаковую подпись".
Я быстро застрял в проблеме "строгий / статический тип против утиной", так как не могу рассчитывать на сигнатуры методов в python. Например:
- Перегрузка конструкторов довольно распространена и естественна в C#, но в Python вам приходится прибегать к
*args **kwargs
и условия; - Свойства приветствуются в C#, но большая часть исходного кода, который я видел в Python, имеет тенденцию устанавливать поля напрямую, хотя использование
@property
или жеproperty()
это довольно просто. - (и так далее).
На самом деле есть (очевидно) очевидное и очень хорошо задокументированное "различие мышления" между одним языком и другим, и я хотел бы уважать эти различия, в то же время заканчивая "тем же" приложением, то есть эквивалентным модель предметной области, архитектура и функциональность.
Так что мой вопрос в основном таков:
Если я собираюсь реализовать одну и ту же абстрактную модель ("UML-подобную") в Python и C#, как мне поступить, в частности, какие конструкции должны быть инвариантными, а какие - разными?
1 ответ
То, что вы назвали "абстрактной моделью" в MDA, называется независимой от платформы моделью (PIM), а ее реализация в C# и / или Python называется платформо-зависимой моделью (PSM). Предполагается, что существуют преобразования / генераторы кода из PIM в PSM, поэтому в зависимости от того, как работают эти генерации кода, вы получите соответствующий исходный код на C# и Python. Обычно такие инструменты предоставляют некоторые средства для управления сгенерированным кодом. И такой контроль обычно осуществляется с помощью аннотаций PIM, которые относятся к PSM, который вы генерируете. Надеюсь это поможет.