argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Никой не е съвършен  (Прочетена 2752 пъти)

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Никой не е съвършен
« -: 29.09.2005, 08:27:19 »

Няколко пъти до сега ми се е случвало да карам колеги да публикуват собствен код и да ми отказват, защото някак се чувстват неуверени и се притесняват, че някой може да намери грешки в програмите им.

Честно казано аз принципно съм на мнение, че е по-добре да ти посочат грешката и да ти свият малко перките, отколкото да продължиш да я правиш. Така или иначе, тези дни попаднах на следния код, който описва свързването към релационна база през Java:

try {
       Connection con = ds.getConnection("user", "secret");
        // . . . code to do the application's work
} catch {
        // . . . code to handle an SQLException
} finally {
        if (con != null) con.close();
}

Хайде да видим за тези няколко реда код колко грешки са допуснати. И за да е по-забавно, ще подчертая че кодът е от Universal Data Access for the Java от сайта на Sun (точно така!). Да не говорим, че  целта на този код е да учи начинаещите програмисти как да пишат. Така че, не се впрягайте - всички пишат глупости от време на време  :-)

Поздрави,

Николай Манчев
Активен

Kas

  • Неактивен Неактивен
  • Публикации: 46
Re: Никой не е съвършен
« Отговор #1 -: 29.09.2005, 10:13:55 »

Референцията con трябва да бъде декларирана преди try блока,защото не е видима във  finally блока и този код изобщо няма да компилира. Интересно ми е обаче как може да се избегне проверката if (con != null)  във finally блока.
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Re: Никой не е съвършен
« Отговор #2 -: 29.09.2005, 15:10:24 »

Е, то да беше само това... Виж че catch-ът изобщо няма тип на изключението, което е недопустимо съгласно синтаксиса.

На всичкото отгоре в сигнатурата на Connection.close() има throws SQLException, което също е изпуснато да се прихване.

На 5 реда - три грешки, които спират компилацията. Да им имам и образователния пример.  :-)
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Re: Никой не е съвършен
« Отговор #3 -: 29.09.2005, 15:17:22 »

Интересно ми е обаче как може да се избегне проверката if (con != null)  във finally блока.

Оф, забравих да отговоря на това. Защо ти е да я избягваш като начало? Иначе принципно вместо

} finally {
        if (con != null) con.close();
}

ако не ти е фатално ресурса да се освободи точно на това място, с чиста съвест можеш да кажеш просто

} finally {
        con = null;
}

и да си щракаш с пръсти  :-D
Активен

Kas

  • Неактивен Неактивен
  • Публикации: 46
Re: Никой не е съвършен
« Отговор #4 -: 29.09.2005, 18:58:32 »

Преди време на едно интервю ми зададоха този въпрос - как мога да избегна проверката и в същото време да съм сигурен, че ресурса е освободен. Ставаше въпрос за един pool с конекции към някаква база и трябваше да съм сигурен, че ресурса е освободен за да не се стигне до недостиг и хабене на конекции, които не се използват.
Активен

Phyz

  • Неактивен Неактивен
  • Публикации: 45
Re: Никой не е съвършен
« Отговор #5 -: 30.09.2005, 09:57:27 »

Ми най малоумния начин е вместо SQLException (който хронично се игнорва и още не мога да разбера защо са го напраили тоя exception checked) да фащаш просто Exception - тогава си ОК, щото ще хванеш null pointera.
Другия по човешки начин е да си направиш един адаптер на Connection интерфейса с празни методи, да го направиш като singleton. Полсе всеки път като дефинираш референцията con вместо да я инициализираш на null я сетваш на singleton а и така си сигурен че във finally метода тя никога няма да е null.
Ама тфа са глупости... всеки който използва JDBC без да си е написал (или да е взел от някъде) един-два дебели слоя над него си е жив мазохист и си заслужава гърча...
Активен
Quidquid latine dictum sit, altum sonatur.
Whatever is said in Latin sounds profound.

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Re: Никой не е съвършен
« Отговор #6 -: 30.09.2005, 19:45:14 »

Ми най малоумния начин е вместо SQLException (който хронично се игнорва и още не мога да разбера защо са го напраили тоя exception checked) да фащаш просто Exception - тогава си ОК, щото ще хванеш null pointera.

Това е адски неправилно! Ясно, че и ти не го препоръчваш щом го наричаш "малоумен" но аз даже едно време в BYTE четох статия, в която кретените обясняваха че при обход на масив, може да се направи оптимизация за избягване на if-а на всяка итерация и вместо това директно да се обработва ArrayIndexOutOfBoundsException.

От това по-голяма простотия никога не бях чел! Дори да оставим на страна това exploit-ване на синтаксиса, подобна глупост може да напише само някой дето си няма идея как работи един JIT и какво е safe reference.

А пък между другото, времето за хвърляне на Exception е пропорционално на дълбочината на execution point-a в стека. Така че като цяло такъв тип хитруване е пълна глупост.

Поздрави,

Николай Манчев
Активен

Boris

  • Неактивен Неактивен
  • Публикации: 45
    • BorisV5
Re: Никой не е съвършен
« Отговор #7 -: 01.10.2005, 17:22:01 »

За съжаление аз също доста често срещам грешки във туториалите  на Java.Sun и не мога да си обясня как е възможно да допускат подобни неща ??? Това е недопустимо, понеже в повечето случаи грешките са очевидни и могат да се предвидят без дори кода да е компилиран.
Активен
BorisV5

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
Re: Никой не е съвършен
« Отговор #8 -: 11.10.2005, 20:09:39 »

Ами много просто. Грешките се правят умишлено, за да може начинаещите програмисти, които ги четат, да си купят книжка написана от някой от Сън.

;)
Активен

Kas

  • Неактивен Неактивен
  • Публикации: 46
Re: Никой не е съвършен
« Отговор #9 -: 12.10.2005, 09:46:43 »

То поне в книгите да нямаше :), но и там има доста, особено тези за по-начинаещи. А и туториалите в повечето случаи са написани много по-синтезирано и ясно от книга 700 стр. и са за предпочитане когато искаш да научиш нещо бързо:)
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org
Re: Никой не е съвършен
« Отговор #10 -: 13.10.2005, 16:53:12 »

Ами много просто. Грешките се правят умишлено, за да може начинаещите програмисти, които ги четат, да си купят книжка написана от някой от Сън.

;)

Ако не беше усмивката отдолу, тоя бисер направо си го вкарвах в колекцията.
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
Re: Никой не е съвършен
« Отговор #11 -: 13.10.2005, 20:05:24 »

... Или да се запишат на курс по Джава при Николай Манчев ;)

поздрави:
а.
Активен