Loggery, mono, C++ i C#. I Ubuntu…
Opublikował/a Kurak w dniu styczeń 19, 2008
Postanowiłem wczoraj pobawić się w napisanie loggerów o podobnej funkcjonalności pod C# i C++, co pozwoliło mi porównać wygodę i szybkość pisania w obu tych językach. Do tego ostatnio zastanawiałem się nad kwestią uruchamiania programów z platformy .NET na linuksowym mono (głównie z powodu edytora do Shadow Clones – żeby był wykorzystywany, musi działać na Linuksie), co zaowocowało połączeniem tych dwóch kwestii i napisaniem programu wykorzystującego Windows.Forms, który testuje logger z C#. Ale po kolei…
Część 1: Loggery w C# i C++
Loggery do gier nie są zbyt skomplikowanym zagadnieniem, dlatego też etap projektowania zakończył się na napisaniu kilkunastu słów na kartce A4. Potem włączyłem edytor… i nie wiadomo kiedy skończyłem pisać. Dzięki sisharpowemu, niezawodnemu IntelliSense logger był gotowy dużo wcześniej, niż przewidywałem. Program testowy z wyjściami loggera na plik tekstowy, konsolę, plik HTML i TextBox także powstał szybko i wygląda tak:
Następnie przyszła kolej na logger w C++ – tutaj już bardziej przyłożyłem się do zaprojektowania wszystkiego i powstał nawet ładny diagram klas na kartce A3. Jeśli chodzi o napisanie tego, to był to dużo wolniejszy proces niż w przypadku pierwszego loggera – IntelliSence z VC++ nie może się równać z tym z VC#, zatem tym razem większość literek, cyferek i innych znaczków została jednak wciśnięta przeze mnie na klawiaturze – przynajmniej czuć w palcach, co się napisało
Mimo nieco trudniejszego procesu tworzenia, bardziej podobało mi się pisanie loggera w C++. Może to dlatego, że ten język znam dużo lepiej? Albo po prostu się przyzwyczaiłem. W każdym razie, loggery są. Teraz pora na…
Część 2: Ubuntu i mono
Uznałem za warte sprawdzenia to, czy ten arcyprosty program testowy uruchomi się bez żadnych zmian pod Linuksem. Ponieważ żadnej dystrybucji Linuksa zainstalowanej nie mam (szkoda miejsca, skoro i tak nie używam), konieczne było Linuksa zdobycie. Ściągnąłem więc Ubuntu. Pierwsza próba instalacji nie powiodła się – Virtual PC zaprotestował i nie pozwalał instalatorowi się wyświetlić. Takie życie
Linuksa w końcu udało mi się zainstalować używając VirtualBox (instalowanie na właściwym komputerze uznałem za ostateczność) i niemal od razu poczułem się jak przed laty – kiedyś używałem Linuksa. Czemu tak się poczułem, mimo, że w każdym momencie mogłem się przełączyć na Vistę? Otóż, magia pakietów. Jako kilkuletni użytkownik Windows przyzwyczaiłem się do tego, że jeśli chcę mieć jakiś program, to zdobywam instalator (ściągam, kupuję) i go włączam, ewentualnie podaję parę informacji. Natomiast niebywale user-friedly Ubuntu ciągle krzyczał o niespełnionych zależnościach… Gdy w końcu udało mi się zaktualizować mono do najnowszej wersji, musiałem wyłączyć VirtualBox, czyli także Ubuntu. Jakie było moje zdziwienie, kiedy system nie mógł się podnieść po ponownym uruchomieniu wirtualnej maszyny… Każdy słyszał o stabilnym i niezawodnym linuksie, ale chyba nikt nie widział
Dobra, koniec poematu i propagandy. Ostatecznie dałem sobie spokój z własnymi próbami zmuszenia Ubuntu do współpracy i poprosiłem o test kogoś, kto Linuksa używa na codzień – jaką odczułem ulgę, gdy zobaczyłem poniższego screena, można sobie wyobrazić

Jednak działa – to dobrze. Pozostaje mieć nadzieję, że deklarowane przez jeden z .NETowych wrapperów Ogre wsparcie dla mono działa. Bo sam bardzo nie chciałbym pisać własnego wrappera…

nameczanin powiedział/a
throw Exception( “\”niezawodnemu IntelliSense\” cannot be instantiated!” );
Sprawdziłeś obie wersje? C++ i C#?
Swoją drogą, kiedy pisałem z .NET w C++, to stwierdziłem, że ta biblioteka nie jest pod ten język. Naprawdę fajną sprawą jest C# do pisania aplikacji okienkowych (toole, bazodanowe, takie tam ewentualnie użytki).
Czemu nie C++? Operatory gcnew, znaczki ^, potrzeba specjalnego pisania klas tak, żeby były nie-”unmanaged”, tylko “managed”, …
A czemu C#? Choćby tworzenie i używanie Singletona wygląda 100x prościej. Wystarczy zrobić, żeby klasa była statyczna. “Klasa statyczna” w wypadku C# ma trochę inne znaczenie niż w C++. W C# nie można stworzyć obiektu typu klasy statycznej, a w C++ można, choćby to był jeden, specjalnie zaprojektowany (właśnie Singleton)
Nie mówię, że wolę C#, bo znacznie bardziej uwielbiam C++, ale C# również wnosi Swoje dobre zwyczaje
Kurak powiedział/a
1. Nie, tylko C#. Logger w C++ to 100% kod natywny, nie lubię C++/CLI (choć czasem jest on najwygodniejszy – patrz poprzednia notka)
2. Tak, zgadzam się, że C# jest fajne do pisania okienek – gdybym się nie zgadzał, to po cholerę bym tego używał? ;>
3. Akurat co do singletona to wolę rozwiązanie z C++, którego używam – zabawa w statyczną klasę niezbyt mi się podoba
A IntelliSense w VC# jest naprawdę niezawodny
Maciek powiedział/a
Singleton w C# nie musi byc klasą statyczna, wystarczy statyczna metoda pobierania i prywatny konstruktor:
public class LogManager
{
#region Singleton Data
private static LogManager _Unique = new LogManager();
private StreamWriter _Writer;
private LogManager()
{
}
public static LogManager Instance
{
get
{
if (_Unique == null)
_Unique = new LogManager();
return _Unique;
}
}
#endregion
}
Kurak powiedział/a
Tak, nie musi – to tylko jedna z możliwych dróg zaimplementowania tego wzorca
Ja używam właśnie czegoś takiego (przy czym instancję tworzę przez jawne wywołanie statycznej metody Create – wolę mieć kontrolę nad tym, kiedy co dokładnie powstaje)