Krótki wstęp, MSChart jest biblioteką do generowania diagramów zarówno w aplikacjach ASP.NET jak i Windows Forms. Tutaj znajdziecie maaaasę przkładów jak można wykorzystać kontrolki i co za pomocą nich można zrobić. Ja nie bawiłem się kontrolkami dla Windows Forms – nawet nie wiem czy się różnią od kontrolek dla ASP.NET. Post dotyczy stricte wykorzystania MSCharts w ASP.NET.

Podczas dynamicznego generowania diagramów z wykorzystaniem MSChart (blog) natknąłem się na trochę beznadziejny problem:

mschart_title_04

Nie licząc iż miejsce wystąpienia błędu było niepoprawne – źle wskazane, to jeszcze opis błędu niewiele mi mówił – coś gdzieś poszło źle, czegoś brakuje, coś zostało źle podane, biblioteka nie działa. Można wymieniać i wymieniać przyczyny takiego błędu.

mschart_title_05

Na szęście stacktrace trochę ograniczył moje poszukiwania, problem występował wyraźnie przy redneringu tytułu, czyli coś musiało być nie tak. Po sprawdzeniu paru własności wiedziałem co dokładnie jest nie tak:

mschart_title_06

To co mnie zdziwiło to czemu dopiero dostałem wyjątek w trakcie renederowania a nie w trakcie inicjalizacji tytułu diagramu w kodzie. Dla mnie biblioteka zewnętrzna zawsze stanowi całość, która powinna określać kontrakt pomiędzy wywołującym a nią. To znaczy, biblioteka nie powinna zezwolić wywołującemu na wykonanie operacji, która spowoduje, iż kod w bibliotece nie zadziała. Jest to złe podejście do projektowania bibliotek. Do tego jeszcze MSChart nie informuje w jakimkolwiek sposób, iż konstruktor przyjmuje jedynie wartości not null, jak i nie informuje, iż może wystąpić jakiś problem.

Wykonałem więc głupi test:

mschart_title_07

I mi szczęka odpadła. Z niego wynika, że nie mogę podać null w konstruktorze od tytułu, ale mogę podać null kiedy przypisuje wartość Text tytułu – gdyż w tym momencie biblioteka zastąpi mój null string.Empty, jest to jakaś maksymalna nieścisłość!

Zajrzałem więc do biblioteki za pomocą .NET Reflectora by potwierdzić swoje przypuszczenia:

mschart_title_02

mschart_title_03

mschart_title_01

Sorki, ale jeżeli ktoś już tworzy bibliotekę i zezwala na przypisanie wartości null do property, to IMO powinien zezwolić na to samo w konstruktorze. A jeżeli nie zezwala – to powinien zwrócić wyjątek ArgumentNullException zarówno w momencie tworzenia obiektu jak I przypisania wartości Text, a nie raz pozwalać raz nie, tutaj się nie da to spróbuj od drugiej strony, tutaj pogłaszcz, tam przytul a tam daj klapsa (sic!). Szkoda bo biblioteka wydawała się fajna dla ASP.NET, ale nie licząc tego małego przypadku to jeszcze kilka dodatkowych ekstra konfiguracyjnych problemów wystąpiło i szczerze mówiąc nie chce mi się z nią już współpracować na stronach webowych. Na pewno są lepsze rozwiązania.

Oczywiście workaround dla tego błędu to:

mschart_title_08

Lub weryfikacja parametru, lub utworzenie Title bez podawania jego tekstu :)

I tak niektórzy powiedzą, iż ja powinienem się upewnić, że parametr nie jest null kiedy go przekazuje do konstruktora – pewnie i powinienem gdybym wiedział, że muszę. Więc jak tworzycie jakiekolwiek biblioteki pamiętajcie o kontraktach! Bo łatwo jest zniechęcić użytkownika :)

2 KOMENTARZE

  1. Cześć, napisałeś, że są lepsze rozwiązania niż msCharts. Masz może coś darmowego do polecenia do zastosowań w Asp.net?

  2. jqPlot – darmo bardzo przyjemnie się z tego korzysta i moim zdaniem wizualnie lepiej wygladajace niż MSChart. Do tego bardziej interaktywne

    http://www.jqplot.com/

    Maja niestety jednen malutki blad z banalnym workaroundem (dodajc dosłownie 11 znakow width=”300”) dla dynamicznie generowanchych Chartow na divach dodanych za pomocą jQuery na IE i na IIS7 (wszystkie parametry musza być true by problem zaistniał) :) ale o tym będzie w przyszlym tygodniu krotki post

    Popatrz sobie na dema, naprawdę dużo rzeczy można zrobić za pomocą ich.

    Do tego sa jeszcze inne charty oparte na jQuery na przykład:
    http://www.1stwebdesigner.com/resources/top-jquery-chart-libraries-interactive-charts/

    mi się z jqPlot jak na razie dobrze pracuje, wiec zachęcam do spróbowania :)

Comments are closed.