poniedziałek, 21 stycznia 2008

Równy czy nierówny - oto jest pytanie

Ktoś kiedyś powiedział "mnie język w programowaniu nie przeszkadza"? Co mnie więcej oznacza, iż doświadczony programista, który miał do czynienia z kilkoma językami (np. C, Java) bez problemu powinien poradzić sobie z programowaniem w kolejnym języku (np. w C#). Jest w tym wiele prawdy, ale czy bez kompleksowej wiedzy z danego języka kod owego programisty będzie na pewno niezawodny?

Rozważmy prosty przykład napisany w języku Java: Czy jest coś w tym przykładzie co mogłoby nas skłonić do refleksji - raczej nie. Oczywiste wydaje się, iż w pierwszym warunku zostanie wyświetlone na konsoli "rozne obiekty", natomiast w drugim warunku "rowne obiekty". Pierwszy warunek będzie spełniony tylko wtedy gdy będziemy mieli do czynienia ze zmiennymi, które wskazują dokładnie na ten sam obiekt. Drugi warunek to już porównanie wartości tych obiektów więc sprawa jest dość oczywista.

Zmodyfikujmy ten przykład: Co się okazuje? Pierwszy warunek jest spełniony w efekcie na konsoli zostanie wyświetlone "ten sam obiekt". Dlaczego? Odpowiedź jest prosta, chociaż nie oczywista: w języku Java w celu zaoszczędzenia pamięci instancje klas Short and Integer o wartościach od -128 do 127 wskazują na ten sam obiekt (obszar pamięci). Inaczej się ma sytuacja jeżeli jawnie użyjemy operatora new: Wówczas zostanie wyświetlone "rozne obiekty".

Wniosek z tego jest jeden, iż bez dogłębnej znajomości języka, konstrukcje, które mogłyby się wydawać oczywiste mogą nas zaskoczyć w najmniej oczekiwanym momencie. Jest na to jednak rada: jeżeli jesteś czegoś pewien sprawdź to, a jeżeli jesteś czegoś bardzo pewien sprawdź to dwa razy...

4 komentarze:

Anonimowy pisze...

Czy tak opisana oszczędność pamięci (klasy short i Integer o wartościach od -128 do 127 wskazują na ten sam obiekt) należy do cech języka czy konkretnej jego implementacji? Według mnie to drugie.

Łukasz Pawlik pisze...

Zgadzam się z Tobą. Według mnie to cecha konkretnej implementacji, w tym przypadku Suna. Dokładne wyjaśnienie tej kwestii można znaleźć na: www.theserverside.com.

Co ciekawe w publikacji SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) by Kathy Sierra and Bert Bates (McGraw-Hill/Osborne 2006) również można o tym przeczytać w rozdziale Certification Objective — Using Wrapper Classes and Boxing (Exam Objective 3.1). Oznacza to, iż na egazminie SCJP wymagana jest znajomości tego zagadnienia, ale w końcu to S(un)CJP :)

Anonimowy pisze...

Co mnie więcej oznacza, iż doświadczony programista, który miał do czynienia z kilkoma językami (np. C, Java) bez problemu powinien poradzić sobie z programowaniem w kolejnym języku (np. w C#)

Wiekszej glupoty nie slyszalem - niech ktos sprobuje nauczyc sie Lispa, Haskella znajac C,Java,C++ itp. Jak dla mnie to zdanie moze byc prawdziwe dodajac zwrot "jezyka takiego samego typu".

Łukasz Pawlik pisze...

Też z tą tezą się nie do końca zgadzam, stąd w dalszej cześci postu wykazywałem, że brak znajomości języka w którym programujemy, choćby podobnego do tego w którym mamy doświadczenie może powodować niemiłe niespodzianki i wpływać niekorzystnie na jakość kodu.