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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 22 авг 2008.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Чтобы можно было так использовать

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

    Mihal Гость

     
  3. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    интересный вариант, че раньше не показывал? :)
     
  4. RonTermit

    RonTermit Гость

    f not isempty(a) then...
     
  5. alb

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    че то не понял, при создании сразу уничтожается что ли?
    сильно не пинать с класами не очень
     
  6. Mihal

    Mihal Гость

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

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

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    а ну теперь дошло
    например при ошибке да
     
  8. azat20

    azat20 Well-Known Member

    Регистрация:
    22 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    может как то так, не проверял,может и не работать.но с объектами работает

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    что есть "IsClass"?! О_о
     
  10. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Azat
    раз уж на то пошло то

    if not IsScalar(a) then...
     
  11. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    один круче другого! как я погляжу :D
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    другой вариант без передачи параметра:

    Код (Text):
    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 запихать в любую переменную, то срабатывает на ура :)
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    я чего-то пропустил?
    а как же Error CUSTOM_CODE,CUSTOM_MESSAGE
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    так тоже можно, только предыдущие варианты без генерации исключений
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    я не к тому что можно, а логично!
    ведь ситуации отказа в инициализации и есть исключение
     
  16. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    а какой практический смысл вы здесь подразумеваете if not a is nothing then... ?
     
  17. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну, логически это исключение (из общего принципа работы объекта), но говоря на уровне реализации это может быть как генерация исключения так и возврат определенного значения, т.е. не обязательно генерация ошибки...
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    в качестве дискуссии...
    "принципа работы объекта" не может быть - ежели он не создается!
    и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта
    т.е. дальше работать можно если понимаете что делаете, а если нет - то "аварийный" выход
    по сути if и является обработчиком этого случая, но если вы его "забудете" проверить - то получите исключение в др. месте (а не в данном куске кода), что может усложнить отладку

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    lmike, чес гря, я не понял твоих замечаний :unsure:

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

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

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

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    неинициализированным явл. любой объявленный объект...
    декларация и инициализация необязательно (типично - редко) бывают в одном месте кода
    все-равно пишется "обработчик" ситуации Nothing...

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

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

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

Поделиться этой страницей