Arhn - архитектура программирования

Согласование отсутствия наследования в бережливости с определениями методов в Java/Scala

Я определил набор структур в Thrift. Концептуально некоторые из этих структур являются подклассами общего родительского класса. Поскольку Thrift не поддерживает наследование структур, я использовал следующую стратегию для определения структур:

Пример

Скажем, A и B являются подтипами родительского type P. Вот мои определения бережливости, чтобы представить это:

struct P {
  1: i32 childType,
  2: list<byte> payload
}

struct A {
  1: i32 x
}

struct B {
  1: i32 y
}

Объекты type A and B сериализуются как записи type P (поле payload будет хранить сериализованную версию объекта, а значение childType будет указывать, относится ли сериализованная полезная нагрузка к type A or B). Во время десериализации значение поля childType указывает, как нужно десериализовать payload.

Однако этот подход создает трудности при написании кода на объектно-ориентированном языке, таком как Java или Scala. Например, в функции, которая возвращает объект type P, я не могу вернуть результат type A или type B.

Вопрос

(i) Существует ли рекомендуемый подход к решению этой проблемы? т. е. как примирить отсутствие наследования в Thrift с кодом Java/Scala, который использует наследование?

Заранее спасибо.


Ответы:


1

Я не могу сказать, есть ли лучший подход с Java/Scala, но в наших случаях добавление дополнительного члена структуры Thrift, указывающего на его «супер» структуру Thrift, делает то, что мы хотим.

struct Foo {
    1: i32 wtf
}

struct Bar {
    1 : Foo super_
    2 : double moredata
}

Конечно, это всего лишь обходной путь, но с этим можно жить.

20.01.2017

2

Другим обходным решением является использование профсоюзов бережливости, хотя поддержка профсоюзами бережливости (по крайней мере, на некоторых языках) невелика. См. документацию.

Я немного изменяю ваш образец (B.y теперь является строкой), чтобы дать лучший пример. Рассмотрим этот бережливый файл:

struct A {
  1: i32 x
}

struct B {
  1: string y
}

union P {
    1: A a,
    2: B b
}

В коде Java, сгенерированном компилятором thrift 0.9.0, класс P имеет несколько методов, которые можно использовать для определения того, содержит ли P A или B: isSetA/isSetB, getA/getB и getSetField, который возвращает перечисление с указанием типа.

Сгенерированные коды: A.java, B.java и P.java

23.08.2017
  • ни один из файлов A.java, B.java или P.java на данный момент не существует. 04.05.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..