• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы fedotxxl
  • Дата начала
F

fedotxxl

Чтобы можно было так использовать

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

Akupaka

интересный вариант, че раньше не показывал? :)
 
M

Mihal

интересный вариант, че раньше не показывал? :blink:

1. Показывал. И на этом же форуме.
2. У меня ещё много чего в заначке есть :)

че то не понял, при создании сразу уничтожается что ли?
сильно не пинать с класами не очень

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

alb

а ну теперь дошло
например при ошибке да
 
A

azat20

может как то так, не проверял,может и не работать.но с объектами работает

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

morpheus

Azat
раз уж на то пошло то

if not IsScalar(a) then...
 
A

Akupaka

один круче другого! как я погляжу :D
 
A

Akupaka

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
7 927
608
BIT
150
я чего-то пропустил?
а как же Error CUSTOM_CODE,CUSTOM_MESSAGE
 
A

Akupaka

так тоже можно, только предыдущие варианты без генерации исключений
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
я не к тому что можно, а логично!
ведь ситуации отказа в инициализации и есть исключение
 
A

Akupaka

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
в качестве дискуссии...
"принципа работы объекта" не может быть - ежели он не создается!
и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта
т.е. дальше работать можно если понимаете что делаете, а если нет - то "аварийный" выход
по сути if и является обработчиком этого случая, но если вы его "забудете" проверить - то получите исключение в др. месте (а не в данном куске кода), что может усложнить отладку

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

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

Akupaka

в качестве дискуссии...
"принципа работы объекта" не может быть - ежели он не создается!
и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта
lmike, чес гря, я не понял твоих замечаний :unsure:

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

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

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

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
неинициализированным явл. любой объявленный объект...
декларация и инициализация необязательно (типично - редко) бывают в одном месте кода
все-равно пишется "обработчик" ситуации Nothing...

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

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

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

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