Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Можно ли написать класс, который в случае неудачной инициализации
Форум программистов > Базы данных и администрирование > Lotus > Lotus - Программирование
fedotxxl
Чтобы можно было так использовать

Set a = New MyClass("abc")
if not a is nothing then...
Mihal
Цитата
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
Akupaka
интересный вариант, че раньше не показывал? wink.gif
RonTermit
Цитата(fedotxxl @ 22:08:2008 - 10:57) *
if not a is nothing then...

f not isempty(a) then...
alb
Цитата
Sub new
Call destroy(Me)
End Sub

че то не понял, при создании сразу уничтожается что ли?
сильно не пинать с класами не очень
Mihal
Цитата(Akupaka @ 22:08:2008, 09:35 ) *
интересный вариант, че раньше не показывал? wink.gif


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

Цитата(alb @ 22:08:2008, 10:13 ) *
че то не понял, при создании сразу уничтожается что ли?
сильно не пинать с класами не очень


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

Set a = New MyClass("abc")
if not isClass(a) then...
Akupaka
что есть "IsClass"?! О_о
Morpheus
Azat
раз уж на то пошло то

if not IsScalar(a) then...
Akupaka
один круче другого! как я погляжу biggrin.gif
Akupaka
Цитата(Mihal @ 22:08:2008 - 09:10) *
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 запихать в любую переменную, то срабатывает на ура smile.gif
lmike
я чего-то пропустил?
а как же Error CUSTOM_CODE,CUSTOM_MESSAGE
Akupaka
так тоже можно, только предыдущие варианты без генерации исключений
lmike
я не к тому что можно, а логично!
ведь ситуации отказа в инициализации и есть исключение
Kee_Keekkenen
Цитата(fedotxxl @ 22:08:2008, 09:57 ) *
Чтобы можно было так использовать

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

а какой практический смысл вы здесь подразумеваете if not a is nothing then... ?
Akupaka
Цитата(lmike @ 16:10:2008, 11:47 ) *
я не к тому что можно, а логично!
ведь ситуации отказа в инициализации и есть исключение

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

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

и опять же - это позволяет отличить неинициализированный объект от ошибки инициализации
Akupaka
Цитата(lmike @ 16:10:2008 - 13:21) *
в качестве дискуссии...
"принципа работы объекта" не может быть - ежели он не создается!
и в обсуждаемом случае - это именно так, Nothing - это и есть отсутствие объекта

lmike, чес гря, я не понял твоих замечаний smile.gif

Цитата(lmike @ 16:10:2008 - 13:21) *
т.е. дальше работать можно если понимаете что делаете, а если нет - то "аварийный" выход

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

Цитата(lmike @ 16:10:2008 - 13:21) *
по сути if и является обработчиком этого случая, но если вы его "забудете" проверить - то получите исключение в др. месте (а не в данном куске кода), что может усложнить отладку

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

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

Цитата(lmike @ 16:10:2008 - 13:21) *
это позволяет отличить неинициализированный объект от ошибки инициализации

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

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

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

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

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

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

обработка исключений - не нормальная практика, а требование к нормальному ПО!

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

о какой миграции речь? smile.gif ты хочешь сказать, что единственной проблемой при переносе кода является Nothing? smile.gif
любой алгоритм можно реализовать на каждом конкретном языке по-разному, учитывая возможности оптимизации языка, поэтому говорить о прямом переносе кода без изменений не верно, как по мне...
sax_ol
Цитата(Akupaka @ 16:10:2008 - 15:14) *
инициализация экземпляра класса (объекта) - происходит лишь при вызове конструктора, результатом работы которого и есть объект, в каком-либо состоянии, либо полноценно инициализированном, либо нет...
1 На самом деле "задолго" до конструктора, конструктор это только пользовательская чуть-ли не последняя стадия процесса. Тут все просто - вы же можете обращаться к внутренним полям, вот даже с указателем самого на себя, обращаетесь так жестоко, убиваете с его помощью самого себя на корню. А разве можно убить неродившееся? wink.gif
2. У созданного обекта есть только одно состояние. Он создан и готов к использованию. я к чему .... не надо путать бизнес логику и физический процесс. Объект создан и все, а уж на сколько он инициализирован по отношению к реальной ситуации для данного момента программы, это совсем другая песня.
lmike
если так хочется уточнить - переменная типа Object (или его производных)
и после декларации там уже присутствует Nothing (умолчально инициализируется)

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

привязка логики к особенностям языка и "хаки" в коде могут присутствовать в специфических модулях, но не как стиль программирования в проекте...
Здесь, как мне показалось, возник вопрос по созданию "типичного" кода

да, вариант предложенный вами имеет право на жизнь (как возможность так сделать), но я, например, не вижу области его практического применения
Kee_Keekkenen
често говоря я так и не понял сути : > Можно ли написать класс, который в случае неудачной инициализации, возвращал Nothing?

непонятен ход мысли автора..
1.если у нас нет данных, то и класс, который должен с этими данными что-то делать не нужен
2.если данные есть, то нужно использовать класс, а раз так, то нужно получить экземпляр класса, проверив был ли он создан ранее или создать новый экземпляр..

а раз так, то какой смысл в том, чтобы делать ничто из класса ???
Constantin A Chervonenko
Вот вам примерчик: класс DataBase.

вызов конструктора:
dim db as New DataBase(server, file)

проверка, открылась-ли база:
if db is Nothing then
...
end if
cool.gif
Kee_Keekkenen
Constantin A Chervonenko
это плохой пример, потому что if не срабатывает..
Akupaka
товарищи, что-то вы загоняетесь все и очень глубоко!
вы уж извините, но придираетесь к чему-то чего на самом деле нет!

Цитата(sax_ol @ 16:10:2008 - 16:52) *
1 На самом деле "задолго" до конструктора, конструктор это только пользовательская чуть-ли не последняя стадия процесса. Тут все просто - вы же можете обращаться к внутренним полям, вот даже с указателем самого на себя, обращаетесь так жестоко, убиваете с его помощью самого себя на корню. А разве можно убить неродившееся?
2. У созданного обекта есть только одно состояние. Он создан и готов к использованию. я к чему .... не надо путать бизнес логику и физический процесс. Объект создан и все, а уж на сколько он инициализирован по отношению к реальной ситуации для данного момента программы, это совсем другая песня.

sax_ol, ты как понимаю великий и могучий разработчик компиляторов и линкеров, правда на .NET, гы-гы...
нотес не используешь, но постоянно пытаешься доказать, что ты прав, бо ты так делаешь, а так как ты делаешь, то самое правильное решение...
я тебе так отвечу
1) конечно задолго! ты бы еще сравнил это с объявлением обычных переменных и их инициализацию, когда память под них выделяется задолго до использования! понятно, что конструктор - конструкция, которая позволяет программисту выполнить нужные действия для инициализации "бизнес-логики" его объекта, а то, что перед этим в памяти будет занята куча места под поля и т.п. хню, то это работа которая не интересует программиста, пишущего класс.
2) объект либо есть, либо нет, если я могу вернуть nothing вместо объекта, то наверное это что-то невероятное? в любом случае это указывает на то, что объект после создания может иметь множество состояний!
я вообще ничего не путаю, в отличие от тебя, и отвечаю в теме по теме, а ты считаешь, что можешь ходить из темы в тему и доказывать свое одно и то же... удачи!

Цитата(Kee_Keekkenen @ 16:10:2008 - 20:23) *
1.если у нас нет данных, то и класс, который должен с этими данными что-то делать не нужен
2.если данные есть, то нужно использовать класс, а раз так, то нужно получить экземпляр класса, проверив был ли он создан ранее или создать новый экземпляр..

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

set NotesDoc = NotesDb.GetDocumentByUNID(docUnid)
if not(NotesDoc is nothing) then
' do somt
end if


если ты используешь подобную конструкцию, то правда ты не будешь заканчивать обработку тысячи документов на пятсот десятом?
ты напишешь обработчик исключения, который позволит тебе выполнить обработку всех данных, а именно:

on error 4091 resume next
...
set NotesDoc = NotesDb.GetDocumentByUNID(docUnid)
if not(NotesDoc is nothing) then
' do somt
end if


в этом случае, мы просто пропустим неправильный унид и обработаем следующий.


зы: ребята, вы вообще нотесом занимаетесь или все .NET? если вы не работаете с нотес, то чего вы даете советы в этом форуме?!!
если вас интересуют глобальные вопросы ООП, создания объектов и т.п. то чего вы сюда пришли? идите на форумы, где это обсуждается!
чего вы тут рассказываете, что мы тут все не правы, потому что используем эти конструкции?!!
Модератор: Ненадо указывать кому в каком форуме быть и про что говорить, и не узнаете дорогу куда вы пойдете. Это понятно? Держите себя в руках!
Kee_Keekkenen
Цитата(Akupaka @ 17:10:2008, 10:26 ) *
товарищи, что-то вы загоняетесь все и очень глубоко!
вы уж извините, но придираетесь к чему-то чего на самом деле нет!

да уж куда глубже .. если я написал, что пример плохой значит так и есть !
протрите глаза и освежите память - что бы вы ни писали в значении аргументов метода new класса NotesDataBase
nothing вы не получите.

Цитата(Akupaka @ 17:10:2008, 10:26 ) *
в том-то и дело, что если класс, который выполняет какие-то действия на данными, получает неверные данные, то он не будет их обрабатывать, соотв. экземпляр его не нужен в данный момент времени с этим набором данных, поэтому мы и не создаем его.

я имел в виду идею проверки данных перед дальнейшей их обработкой, а то это выглядит как деление без проверки делителя на ноль
Akupaka
Цитата(Kee_Keekkenen @ 17:10:2008 - 12:57) *
что бы вы ни писали в значении аргументов метода new класса NotesDataBase
nothing вы не получите

прошу прощения, тут я прокосил с этим примером, ты прав
в любом случае у нас есть пример с db.GetDocumentByUnid() smile.gif

Цитата(Kee_Keekkenen @ 17:10:2008 - 12:57) *
я имел в виду идею проверки данных перед дальнейшей их обработкой, а то это выглядит как деление без проверки делителя на ноль

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

Цитата( @ 17:10:2008 - 09:26) *
Модератор: Ненадо указывать кому в каком форуме быть и про что говорить, и не узнаете дорогу куда вы пойдете. Это понятно? Держите себя в руках!

Товарищ модератор, держите себя в руках smile.gif

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

В общем, надеюсь, что мы друг друга понимаем...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.