Классы на Ls

D

Darker

А если "новичок" напишет что-то вроде:
Код:
 Call oReflection.getTypeObject("Я думал, что пишется Duble, а не Double").add(1)
 
T

turumbay

иногда приходится делать такую неприятную штуку, как <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">switch</div></div><div class="sp-body"><div class="sp-content">
Код:
Set oMegaClass = ...
'sTypeName и value передаются откуда-то извне
Select Case sTypeName
Case "Double":
Call oMegaClass.addDouble(value)
Case "Integer":
Call oMegaClass.addInteger(value)
Case "String":
Call oMegaClass.addString(value)
Case "...":
'...
End Select
Хотелось бы получать параметры и типы извне и производить добавление, как-то в цикле - одной строкой..
В этом конкретном примере, передача извне sTypeName избыточна, т.к. value содержит информацию о собственном типе. Т.о., если конечная цель - иметь возможность добавлять значения в цикле, то достаточно убрать case внутрь класса ( или в отдельную функцию - хелпер )
Код:
	Sub addValue(value As Variant)
Select Case Datatype(value)
Case V_INTEGER
Call Me.addInteger(Cint(value))
Case V_STRING
Call Me.addString(Cstr(value))
Case V_DOUBLE
Call Me.addDouble(Cdbl(value))
Case Else
Error 1001, "Illegal argument exception: unexpected Datatype: " & Datatype(value)
End Select
End Sub
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">В качестве строго типизированной альтернативы можно использовать что-то типа:</div></div><div class="sp-body"><div class="sp-content">
Код:
Class MethodParam '' marker interface
End Class

Class IntParam As MethodParam
Sub new(i As Integer)
End Sub
End Class

Class StringParam As MethodParam
Sub new (s As String)
End Sub
End Class

Class MegaClass
Sub add(param As MethodParam)
End Sub
End Class
Осталось только link removed от MethodParam, и мы в дамках.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
233
Darker
Вывалит ошибку ему сразу же, новичок глянет документацию или комменты к классам и всё сразу же поймёт.
Можно добавить константы и пользоваться ими:
Код:
Public Const TYPE_DOUBLE = "Double"
Public Const TYPE_INTEGER = "Integer"
Public Const TYPE_STRING = "String"
Но, на самом деле, это не нужно, т.к. в данном примере (и в большинстве подобных) значения для "типа" будут браться из конфигурационных документов, где невалидных значений просто не будет. А если будет -> генерация ошибки -> исправление -> забывание о данной ситуации чуть менее, чем навсегда.


turumbay
Я привёл пример на одном унифицирующем методе, а их может быть до десятка, а то и больше. Похоже Вы не прониклись идеей, а она была в том, чтобы уйти от Select Case'ов в каждом унифицирующем методе для большей скорости выполнения.

Тип переменной не всегда говорит о действительно нужном типе, - у меня в системе "1" может быть строкой, а, для случая экспорта в другую систему, там это может быть числом.

Относительно типизированная конструкция есть и сейчас, благодаря тому, что обращение к несуществующему тэгу списка будет генерировать ошибку 120, и при добавлении в метод getTypeObject обработчика ошибок ситуация прекрасно разрешается. Тут можно рассуждать о том, что отлов ошибок на этапе компиляции лучше, но есть случаи, когда можно этим пожертвовать ради скорости выполнения или удобства; о возникновении и исправлении возможной ошибки писал чуть выше.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!