Как правильно спроектировать объектную модель?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Как правильно спроектировать объектную модель?

Сообщение jangle » 19.03.2013 (Вт) 12:24

Помогите а то мозги уже кипят :? Есть некий проект написанный на Visual Basic 6, который обеспечивает считывание и запись смарт-карт трех разных типов, через три разных ридера. Ридеры несовместимы с собой ни на уровне "железа" и SDK у них разный, карты которые читают ридеры тоже несовместимы между собой по системе команд APDU. Сейчас проект представляет собой адский, трешовый говнокод с сотнями Goto и не читаемым кодом. Надо разгрести авгиевы конюшни, построить красивую объектную модель, выкинуть говнокод и т.д. Вот я нарисовал примерную схему проекта.

Изображение

Должен быть один класс Readers, в котором коллекция подключенных ридеров, класс должен выкидывать события о подключении/отключении ридеров и событие о приходе/уходе карты. Мозги заклинило на этапе куда привинтить класс Cards? Экземпляр должен создаваться в каждом классе CardMan, Feig, MicroEM или в классе Readers? Методы чтения/записи на карты реализовывать в классах CardMan, Feig, MicroEM или в классах ICODE SLI, Mifare1K, MifareUltraLight?
Вопрос чисто по-объектной архитектуре приложения. Для упрощения карты можно представить в виде флешек с разной системой команд, а ридеры USB разъемы для подключения этих флешек.

Да и впоследствии этот проект должен будет портироваться на VB.NET и Java, поэтому важно чтобы структура классов была реализована правильно.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2013 (Вт) 12:52

Если возможно, интерфейс ICard и три реализации для каждого типа карты. Иначе, интерфейс IReader, три реализации для каждого типа карт, для карт общую часть можно вынести в родительский класс или интерфейс, для reader'ов - тоже.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re:

Сообщение jangle » 19.03.2013 (Вт) 12:55

Qwertiy писал(а):Если возможно, интерфейс ICard и три реализации для каждого типа карты. Иначе, интерфейс IReader, три реализфции для каждого типа карт.


А можно пример интерфейса? Имеется ввиду Implements ? Никогда их не делал в VB6

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2013 (Вт) 13:43

Да, имеется в виду Implements. Насколько я представляю: создаёшь класс, который содержит пустые свойства и финкции, а у других указываешь Implements этот класс. Нормального наследования в VB6 нет, так что что делать с общими реализациями методов, не знаю, но в остальных языках можно будет применить абстрактный класс вместо интерфейса и от него наследоваться.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Re:

Сообщение Diamock » 19.03.2013 (Вт) 16:22

jangle писал(а):
Qwertiy писал(а):Если возможно, интерфейс ICard и три реализации для каждого типа карты. Иначе, интерфейс IReader, три реализфции для каждого типа карт.


А можно пример интерфейса? Имеется ввиду Implements ? Никогда их не делал в VB6

Не знаю насколько это пример интерфейса, но я разбираясь с Implements, поступал так:
Код: Выделить всё
'Базовый класс: Name - BaseClass

Option Explicit

Public Function ExempleFunction(Parametr As Long) As Long
    '...
    'Функция абстрактного класса не имеющая кода
    '...
End Function

Код: Выделить всё
'Первый класс наследующий функцию из BaseClass: Name - Class1

Option Explicit

Implements BaseClass

Function BaseClass_ExempleFunction(Parametr As Long) As Long
    BaseClass_ExempleFunction = 10 - Parametr
End Function

Код: Выделить всё
'Второй класс наследующий функцию из BaseClass: Name - Class2

Option Explicit

Implements BaseClass

Function BaseClass_ExempleFunction(Parametr As Long) As Long
    BaseClass_ExempleFunction = 10 + Parametr
End Function

Код на форме:
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Dim mCls As New Class2
    Text1.Text = mCls.BaseClass_ExempleFunction(5)
End Sub

Private Sub Command2_Click()
    Dim mCls As New Class1
    Text1.Text = mCls.BaseClass_ExempleFunction(5)
End Sub

Вот как-то так.
Вложения
Снимок11.png
Снимок11.png (6.45 Кб) Просмотров: 2752
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как правильно спроектировать объектную модель?

Сообщение Хакер » 19.03.2013 (Вт) 18:47

Diamock, глупость это всё, и при том большая.

Это всё равно, что ты скажешь «я женюсь на Ахмеде».
Если говоришь «женюсь на», значит после этого должно стоять женское имя. А Ахмед это явно не женщина.

Так вот если ты пишешь Implements, значит после него должно стоять имя интерфейса. А BaseClass это явно не имя интерфейса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Как правильно спроектировать объектную модель?

Сообщение Diamock » 19.03.2013 (Вт) 20:21

Хакер писал(а):Diamock, глупость это всё, и при том большая.

Это всё равно, что ты скажешь «я женюсь на Ахмеде».
Если говоришь «женюсь на», значит после этого должно стоять женское имя. А Ахмед это явно не женщина.

Так вот если ты пишешь Implements, значит после него должно стоять имя интерфейса. А BaseClass это явно не имя интерфейса.

Если честно, не понял в чём моя глупость? Наверно, неудачный пример.
Код: Выделить всё
Option Explicit
'Класс Тактико-технические характеристики
'Имя класса: PerformanceCharacteristics

Dim varRapidityOfFire As Variant

'Скорострельность
Public Property Get RapidityOfFire() As Variant
    RapidityOfFire = varRapidityOfFire
End Property

Public Property Let RapidityOfFire(ByVal NewRapidityOfFire As Variant)
    varRapidityOfFire = NewRapidityOfFire
End Property

Код: Выделить всё
Option Explicit
'Класс: Пушка
'Имя класса: Gun

Implements PerformanceCharacteristics

Private Property Let PerformanceCharacteristics_RapidityOfFire(ByVal RHS As Variant)
   
End Property

Private Property Get PerformanceCharacteristics_RapidityOfFire() As Variant
   
End Property

Код: Выделить всё
Option Explicit
'Класс: Танк
'Имя класса: Tank

Implements PerformanceCharacteristics

Private Property Let PerformanceCharacteristics_RapidityOfFire(ByVal RHS As Variant)
   
End Property

Private Property Get PerformanceCharacteristics_RapidityOfFire() As Variant
   
End Property

Вот новый пример. Основной класс ТТХ PerformanceCharacteristics и два других класса Танк Tank и Пушка Gun.
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как правильно спроектировать объектную модель?

Сообщение Хакер » 19.03.2013 (Вт) 20:38

Diamock писал(а):Если честно, не понял в чём моя глупость? Наверно, неудачный пример.

В том же, в том глупость 70 процентов прочих.

Ты совершенно не понимаешь, что такое Implements, что такое COM-интерфейсы и что такое COM-классы, где в VB лежит граница между двумя этими ортогональными сущностями.

Это в первую очередь заключается в том, что ты привлекаешь термины, характерные для механизма наследования. «Основной класс», к примеру. И вместо IWeaponEquipped у тебя PerformanceCharacteristics

И самое главное, внутри PerformanceCharacteristics у тебя объявлено приватное свойство, а внутри членов есть какой-то код, то есть методы/свойства не пусты. Это супербессмысленно при исопльзовании Implements.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.03.2013 (Вт) 22:34

Хакер писал(а):И самое главное, внутри PerformanceCharacteristics у тебя объявлено приватное свойство, а внутри членов есть какой-то код, то есть методы/свойства не пусты. Это супербессмысленно при исопльзовании Implements.

Ну теоретически, такое можно использовать для реализации наследования, правда через одно место, но ведь в VB6 лучше нельзя?
Хотя, в коде действительно фигня...

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Как правильно спроектировать объектную модель?

Сообщение Diamock » 20.03.2013 (Ср) 15:38

Хакер, ты как всегда прав! Почитав про полиморфизм, наследование я ещё больше запутался. Хотелось бы узнать об этом более подробно и развёрнуто, расскажи об этом, потому что больше некому. Желательно с примером.
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как правильно спроектировать объектную модель?

Сообщение Хакер » 20.03.2013 (Ср) 16:28

Diamock писал(а):потому что больше некому.

Да уж куда-уж.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно спроектировать объектную модель?

Сообщение ger_kar » 22.03.2013 (Пт) 0:18

Придется поведать мне, естественно с позиции моего понимания.
Ну и в качестве примеров те, которые уже приведены в теме. Ну и для начала ответить на такие вопросы. Если взять и разложить обычный, всем хорошо знакомый класс VB6 на атомы, что можно из него вычленить. Т.е., что есть сам класс, сколько их, что есть интерфейсы и сколько их, и сколько вообще их может быть :) . Так вот у стандартного класса VB6 класс всегда и при всех обстоятельствах всегда один, а вот интерфейсов у него может быть 2 и более. Если просто создать пустой класс, без единой строчки кода, то мы уже будем иметь 1 класс и 3 интерфейса, а точнее
Class1 - Класс
IUnknown - Интерфейс
IDispatch - Интерфейс
Class1 - - Интерфейс

Причем имя последнего интерфейса будет совпадать с именем класса и на данный момент интерфейс фактически пока будет пустым.
А можно добавить еще интерфейсов? Да запросто. Для этогоImplements то собственно и предназначен. Т.е. делая объявление Implements Interface мы просто сообщаем компилятору, о том, что этот класс будет дополнительно к имеющимся будет поддерживать (реализовывать) еще и объявленный интерфейс. Сам интерфейс может быть объявлен как в модуле класса, тогда его имя будет совпадать с именем этого модуля, так и в TLB, и тогда имя можно вообще задать произвольное. Хорошо объявили новый интерфейс, но этого явно недостаточно. Ибо любой интерфейс имеет вполне определенный набор свойств, методов и у каждого могут быть свои аргументы и т.п. Таким образом необходимо в точности повторить структуру того интерфейса, который имплементируется. Как минимум должно быть объявление всех свойств и методов интерфеса. Ну а далее... Далее начинается его реализация т.е. наполнение объявленных свойств и методов соответствующим кодом. Ну вот пока все. Потом дополню.
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 16

    TopList