Можно ли написать класс, который в случае неудачной инициализации

fedotxxl

Well-Known Member
09.11.2005
614
0
#1
Чтобы можно было так использовать

Set a = New MyClass("abc")
if not a is nothing then...
 
M

Mihal

Гость
#6
интересный вариант, че раньше не показывал? :blink:
1. Показывал. И на этом же форуме.
2. У меня ещё много чего в заначке есть :)

че то не понял, при создании сразу уничтожается что ли?
сильно не пинать с класами не очень
Это - пример. В конструкторе лепи ифы и запускай дестрой. И получишь после инициализации при определённых уловиях пустой объект.
 

alb

Well-Known Member
13.07.2005
212
0
#7
а ну теперь дошло
например при ошибке да
 

azat20

Well-Known Member
22.07.2008
244
0
31
Казань
#8
может как то так, не проверял,может и не работать.но с объектами работает

Set a = New MyClass("abc")
if not isClass(a) then...
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#12
Class MyClass
Sub new
Call destroy(Me)
End Sub

Sub delete

End Sub

Private Sub destroy(Me1 As MyClass)
Delete Me1
End Sub
End Class
другой вариант без передачи параметра:

Код:
Public Class MyClass
private mDoc as NotesDocument

Public Sub New(ADoc As notesdocument)
If ADoc Is Nothing Then
Dim MeObj As Variant
Set MeObj = Me
Delete MeObj
Else
Set mDoc = ADoc
End If
End Sub

End Class
т.е. весь смысл в том, что просто "Delete Me" нельзя использовать, а если сначала Me запихать в любую переменную, то срабатывает на ура :)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#15
я не к тому что можно, а логично!
ведь ситуации отказа в инициализации и есть исключение
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#17
я не к тому что можно, а логично!
ведь ситуации отказа в инициализации и есть исключение
ну, логически это исключение (из общего принципа работы объекта), но говоря на уровне реализации это может быть как генерация исключения так и возврат определенного значения, т.е. не обязательно генерация ошибки...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#18
в качестве дискуссии...
"принципа работы объекта" не может быть - ежели он не создается!
и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта
т.е. дальше работать можно если понимаете что делаете, а если нет - то "аварийный" выход
по сути if и является обработчиком этого случая, но если вы его "забудете" проверить - то получите исключение в др. месте (а не в данном куске кода), что может усложнить отладку

я часто "ругаюсь" на девелоперов доминошных классов и именно из-за отсутствия генерации исключения, потому как не проверив на Nothing я гарантировано полезу в код выискивать где ошибся, и хорошо если получение объекта окажется рядом по коду (от ошибки)

и опять же - это позволяет отличить неинициализированный объект от ошибки инициализации
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
34
Kiev, Ukraine
#19
в качестве дискуссии...
"принципа работы объекта" не может быть - ежели он не создается!
и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта
lmike, чес гря, я не понял твоих замечаний :unsure:

т.е. дальше работать можно если понимаете что делаете, а если нет - то "аварийный" выход
ну, отсутствует объект, и что? надо биться головой об стол? :(
если мы не понимаем что делаем, то какого мы вообще занимаемся этим делом?..

по сути if и является обработчиком этого случая, но если вы его "забудете" проверить - то получите исключение в др. месте (а не в данном куске кода), что может усложнить отладку
как можно забыть проверить состояние чего-то, если мы умышленно это используем?
это как пить воду из бутылки, но забыть открыть крышку! у тебя часто такое получается? :blink:

кроме того, есть место создания объекта и есть место его использования, если мы получаем искл. ситуацию связанную с неинициализированным объектом, то понятно, что это будет первое место его использования после инициализации, а найти место инициализации не так сложно, даже в очень запутанном коде - дело практики...
то, что ты не проверяешь состояние объекта не указывает на ошибку разработчика, это твоя личная ошибка! т.к. ты не пользуешься инструкциями по использованию объектов.

это позволяет отличить неинициализированный объект от ошибки инициализации
как может быть объект инициализированным при наличии ошибок инициализации, и как может объект без ошибок инициализации быть неинициализированным?!

ты уж извени, но я не могу понять что такого страшного в отсутствии генерации искл.ситуации...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 433
351
homepage.mac.com
#20
неинициализированным явл. любой объявленный объект...
декларация и инициализация необязательно (типично - редко) бывают в одном месте кода
все-равно пишется "обработчик" ситуации Nothing...

Вы часто проверяете объекты в коде, перед его использованием (много вложенные вызовы ф-ций и т.п)..., что-то мне подсказывает что нет :unsure:
поверьте - забыть можно (я забываю, иногда, и не стыжусь этого), а ежели код чужой - то и наиболее вероятно

обработчик исключений - нормальная практика программирования (ООП)
и уж коли он обязательно присутствует - смешно его не пользовать

в данном случае мы умышленно делаем Nothing, при неудаче инициализации и вызов исключения гарантировано дестроит объект (без хаков)
попытка получить инстанс при создании объекта и получение Nothing - это "ошибка", и она должна оформляться как ошибка ИМХО
это упрощает понимание кода и предсказуемость его поведения...
к тому же - я не обязан помнить про Nothing, а в др. языках - он и не насинг вовсе (это упрощает миграцию кода)