Monthly archive for October, 2009

Ściąga z modyfikatorów dostępu

2009-10-16 16:08

W prawie wszystkich językach obiektowych istnieją tak zwane specyfikatory dostępu, przykładem których jest choćby public czy private. Pozwalają one ustalać, jak szeroko dostępne są poszczególne składniki klas w stosunku do reszty kodu. Modyfikatory te występują m.in. w trzech najpopularniejszych, kompilowalnych językach obiektowych: C++, C# i Javie.

Problem polega na tym, że w każdym z nich działają one inaczej. Mało tego: każdy z tych języków posiada inny zbiór tego rodzaju modyfikatorów. Dla kogoś, komu zdarza się pisać regularnie w przynajmniej dwóch spośród nich, może to być przyczyną pomyłek i nieporozumień.
Dlatego też przygotowałem prostą ściągawkę w postaci tabelki, którą prezentuję poniżej. Symbol języka występujący w komórce oznacza tutaj, że dany modyfikator (z wiersza) powoduje widoczność składnika klasy w określonym miejscu (z kolumny).

Specyfikator Klasa Podklasa Pakiet Reszta
public C++ C# Java C++ C# Java C# Java C++ C# Java
protected C++ C# Java C++ C# Java Java
protected internal C# C# C#
internal C# Java C# Java
private C++ C# Java

Parę uwag gwoli ścisłości:

  • Znaczek C++ nie występuje w kolumnie Pakiet nawet dla modyfikatora public, jako że w tym języku w ogóle nie istnieje pojęcie pakietu.
  • Sam termin ‘pakiet’ jest poza tym właściwy dla Javy. W .NET (C#) jego odpowiednikiem jest assembly, jakby ktoś nie wiedział :)
  • Z kolei internal jest słowem specyficznym dla C#, a jego ekwiwalentem w Javie jest po prostu pominięcie modyfikatora w deklaracji (np. int x; zamiast internal int x;).
  • W końcu, protected internal jest modyfikatorem występującym wyłącznie w C#/.NET.
Tags: , , , , , ,
Author: Xion, posted under Programming » 10 comments

override w C++, i nie tylko

2009-10-13 19:13

O braku słowa kluczowego override w C++ zdarzyło mi się już wspominać. Wskazywałem też, że jego niedobór jest całkiem istotnym brakiem, gdyż przypadki nadpisywania metod wirtualnych nie zawsze są zupełnie oczywiste.
Tym bardziej jest mi miło podzielić się odkryciem, które kiedyś poczyniłem na forum Warsztatu. Dowiedziałem się mianowicie, że słówko to do C++ można… dodać!

Jak to? – słychać pewnie pełne zdziwienia głosy. Ano bardzo prosto; zostało to zresztą wyczerpująco przedstawione w oryginalnym poście Esidara. Tutaj pokrótce tylko nakreślę jego ideę, która sprowadza się do genialnego spostrzeżenia, iż C++ zasadniczo radzi sobie bez override. A skoro tak, to jego wprowadzenie jest banalnie i wymaga zaledwie jednej linijki kodu:

  1. #define override

I już! Składniowo można go teraz używać dokładnie tak samo jak analogicznego słówka z C#… albo właściwie jakkolwiek inaczej – implementacja jest bowiem na tyle elastyczna, że zaakceptuje każde jego wystąpienie :) To aczkolwiek jest też, niestety, jego wadą…

W porządku, żarty na bok. Żeby ta notka nie była jednak zupełnie bezużyteczna, pokażę jeszcze, jak przekonać Visual C++, by nasze nowe słówko było przezeń kolorowane tak, jak inne słowa kluczowe w C++.
Da się to zrobić, tworząc (lub edytujący istniejący) plik UserType.dat, umieszczony w tym samym katalogu co plik wykonywalny Visual Studio (devenv) – czyli gdzieś w czeluściach Program Files, zapewne. W tymże pliku wpisujemy w nowej linijce override. Jeśli przypadkiem chcielibyśmy kolorować też inne, niestandardowe słowa kluczowe (to pewnie jest bardziej prawdopodobne), to każde z nich należy umieścić w osobnej linijce.
Po zapisaniu pliku i restarcie VS wystarczy teraz wejść w opcje programu, do zakładki Environment > Fonts & Colors, a tam na liście Display items zaznaczyć User Keywords i przyporządkować im wybraną czcionkę i/lub kolor. Możliwe zresztą, że w ogóle nie musimy tego robić, jako że domyślnie własne słowa kluczowe kolorowane są tak, jak te “oryginalne”.

Tagi kontra kategorie

2009-10-10 20:46

Tydzień temu pozwoliłem sobie na poprawienie strony pod względem formy, czyli zaaplikowałem zupełnie nowy layout. (Z opinii wynika, że nie wszyscy podzielają zdanie o jego lepszym wyglądzie, ale zakładam, że to głównie kwestia przyzwyczajenia ;]). Teraz przyszedł z kolei czas na usprawnienia funkcjonalne, by treść bloga można było przeglądać łatwiej, szybciej, przyjemniej, i w ogóle lepiej :)

W tym celu odchudziłem to wybitnie rozrośnięte drzewko kategorii, które przez bardzo długi czas zajmowało dużą część miejsca na pasku bocznym po prawej. Większość pozycji się nie ostała i teraz kategorii jest kilka razy mniej. Taki ruch był o tyle właściwy, że w założeniu kategorie powinny być tylko ogólnymi szufladkami do umieszczania w nich treści. Przy takiej ich ilości będą, jak sądzę, lepiej spełniać to zadanie.
Wycięcie wielu kategorii służących jako tematyczne etykietki (np. “Windows” czy “C/C++”) nie oznacza jednak, że nic już nie da się tutaj znaleźć. Ich funkcję (z nawiązką) przejmują bowiem tagi, i to łącznie ze sztandarowym wynalazkiem Web 2.0, czyli chmurką tagów :) Ona właśnie zajmuje “odzyskaną” przestrzeń bocznego paska.

Cała ta reorganizacja nie jest może tak zauważalna jak zmiana wyglądu, ale pozwalam sobie o niej napisać z jednego prostego powodu. Ponowne przejrzenie prawie 350 (!) notek, przydzielenie ich do odpowiednich kategorii oraz opatrzenie odpowiednimi tagami nie jest na pewno zadaniem na pięć minut. A skoro udało mi się tego dokonać, uważam za stosowne pochwalić się tym :P

Tags: ,
Author: Xion, posted under Website » 5 comments

Co to jest przeglądarka?

2009-10-08 22:31

Prawie dokładnie dwa lata temu pisałem o tym, że przeglądarki WWW wpisują w dziwny trend przyswajania sobie coraz to nowych funkcjonalności. Część z nich nie musi być zresztą w jakikolwiek sposób związana z przeglądaniem stron. Aż chciałoby się jeszcze dodać, iż wkrótce użytkownicy zapomną, do czego ich przeglądarki tak naprawdę służą oraz gdzie się “kończą”.

Loga trzech przeglądarekNo i voila – to już się dzieje. Oto powstała strona internetowa, z której można się dowiedzieć… czym są przeglądarki, dlaczego nie są tym samym co internetowe wyszukiwarki i czym różnią się od reszty systemu operacyjnego. Tę wiedzę możemy posiąść między innymi poprzez oglądnięcie wielce interesującego filmiku. Żeby było jeszcze zabawniej, wspomnę, że tę edukacyjną witrynę przygotował nie kto inny, jak tylko sam… Google!
W rzeczywistości jednak nie ma się z czego śmiać. Skoro już nawet tam dostrzegana jest potrzeba szerszego informowania o tym, że Firefox jest czym innym niż Windows, a pasek adresu to nie to samo co pole zapytań wyszukiwarki, to ze stanem tej wiedzy wśród tzw. przeciętnych użytkowników musi być naprawdę źle. A skoro granica między online i offline tak bardzo się zatarła, to ani się obejrzymy i zawód programisty zostanie zastąpiony przez web developera…Brr! Chciałbym, żeby tym razem moje przewidywania w tej dziedzinie się nie sprawdziły :P

Tags:
Author: Xion, posted under Internet » 6 comments

Ciągnięcie okna za wnętrze

2009-10-06 21:14

System Windows pozwala tworzyć okna o różnych niestandardowych właściwościach – między innymi takich, które nie zawierają żadnego standardowego elementu, jak pasek tytułu czy przycisk zamknięcia. Kiedy zechcemy umożliwić przesuwanie takiego okna, to natrafimy na klasyczny problem Windows API, który posiada kilka rozwiązań. I jak to często bywa, mało które jest dobre ;)

Najkrótszym jest obsłużenie komunikatu WM_NCHITTEST. Przy jego pomocy system pyta okno, w jaką jego część “trafia” (stąd nazwa hit test) podany punkt. Trik polega na oszustwie poprzez udawanie, że prawie całe nasze okno (a przynajmniej jego obszar klienta) jest paskiem tytułu:

  1. case WM_NCHITTEST:
  2.     LRESULT hit = DefWindowProc(hWnd, uMsg, wParam, lParam);
  3.     return hit == HTCLIENT ? HTCAPTION : hit;

Jest to jednak na tyle skuteczne, że wówczas nasze okno naprawdę zacznie składać z samego paska tytułu. Najpoważniejszym (acz wcale nie jedynym) skutkiem ubocznym tego faktu jest niemożność jakiejkolwiek interakcji z kontrolkami zawartymi w oknie. Jeśli więc mamy takowe, to mamy też kłopot :)

Można oczywiście załatwić wszystko ręcznie: wykryć przeciąganie (WM_LBUTTONDOWN), “złapać” myszkę (SetCapture), odpowiednio przesuwać okno (np. SetWindowPos) o różnicę początkowej oraz aktualnej pozycji kursora (w WM_MOUSEMOVE), a na koniec zwolnić gryzonia (ReleaseCapture) w odpowiedzi na koniec przeciągania (WM_LBUTTONUP). Uff… Sporo roboty, nieprawdaż? Tak to jest, kiedy oszustwo nie popłaca :)
A może jednak?… Pomysł z podszyciem się pod pasek tytułu wydawał się dobry, lecz sęk w tym, że nie potrzebujemy (wręcz nie chcemy) całej jego funkcjonalności. Dlatego zamiast dużego przekrętu posłużmy się małym: symulujmy tylko i wyłącznie wciśnięcia lewego przycisku myszy:

  1. case WM_LBUTTONDOWN:
  2.     SendMessage (hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
  3.     break;

Wciśnięcia kierowane w pasek tytułu, rzecz jasna. W ten sposób “wywołamy” niejako tę część jego możliwości, która nas interesuje – czyli przesuwanie okna. Jednocześnie, ponieważ robimy to dopiero w WM_LBUTTONDOWN, nie przeszkadzamy innym kontrolkom w odpowiadaniu na zdarzenia myszy.

To rozwiązanie ma jeszcze jedną zaletę: daje się je zastosować także w środowiskach, które nie dają łatwego dostępu do procedury zdarzeniowej okna – jak np. Windows Forms. W nich wystarczy wywołać SendMessage wewnątrz zdarzenia w rodzaju OnMouseDown (wciśnięcie przycisku myszy nad oknem).

Tags: , ,
Author: Xion, posted under Programming » 4 comments

Jest ładniej

2009-10-04 12:26

…i będzie jeszcze ładniej – niż jest. No, może niezupełnie – nietrudno bowiem zauważyć, że już teraz jest zupełnie dobrze. Zniknęła przecież ta niezbyt imponująca niebiesko-szara kolorystyka, okraszona tu i ówdzie pospolitymi gradientami. Na obecny, nowy layout powinno się już patrzeć zdecydowanie przyjemniej.
A skąd on się w ogóle wziął? Bo chyba nikt nie podejrzewa, że mój wybitnie ograniczony talent artystyczny zdolny jest do takich dzieł :) Faktycznie nie jest, a niniejszy szablon otrzymałem w prezencie od znajomej, utalentowanej graficzki i webdesignerki (zainteresowani mogą tutaj obejrzeć inne jej prace).

Docelowo trzeba było go oczywiście dostosować do współpracy z WordPressem, ale koniec końców okazało się całkiem wykonalne ;) Nie jestem wprawdzie wielkim fanem PHP, lecz akurat w tym przypadku prostota API, jakie należało przy okazji wykorzystać, była na tyle duża, że dało się to zrobić bez większych problemów. Jeszcze jeden dowód na to, że podjęta ongiś decyzja o wykorzystaniu właśnie WP okazała się nadzwyczaj trafna.

A zatem, skoro kwestia formy wydaje się na jakiś długi czas załatwiona, życzę wszystkim przyjemnego oglądania i czytania.

Tags:
Author: Xion, posted under Website » 20 comments
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.