MFC alive and almost kicking


Kurser om Microsoft Foundation Classes (MFC) är det inte många som frågar efter numera. Det var Microsofts stora klassbibliotek i C++ på 90-talet. Föregångaren till .Net-biblioteket. Första versionen avsedd för Windows 3. Man kan gissa att hela Officepaketet utvecklades i MFC, och i ATL – det andra stora klassbiblioteket fast med inriktning på utveckling av COM-komponenter. MFC är främst ett bibliotek för fönsterprogrammering. Visual Studio har fullt stöd för MFC-utveckling och klassbiblioteket befinner sig i version 10 med vidareutveckling i VS2012.

Därför var det kul när det oväntat dök upp inte mindre än fyra livs levande kursdeltagare för några veckor sedan som ville ha en T323 – MFC-kursen. Det var min huvudsysselsättning under 90-talet. Jag skrev applikationer för redaktionell produktion, främst för dagstidningar, i MFC och höll fram till .Net-genomslaget 2002-2003 MFC-kurserna. Jag skrev i själva verket det mesta av kurspärmen. Men nu hade jag inte hållit den på åtskilliga år och var glad att jag alls hade kurspärmen kvar. Jag tror inte någon kurs med det innehållet körts i detta land alls på de senaste åren.

Efter 2002 blev det både för mig och resten av windowsvärlden mest .Net och C#, men MFC-kurserna klingade av ganska långsamt eftersom åtskilliga organisationer lagt stora resurser i egna MFC-applikationer som inte lät sig porteras i en handvändning.

MFC-kursen var under de första åren på 2000-talet mycket tacksam att hålla. Den typiske deltagaren kom ganska färsk från universitetet och hade använt Java eller .Net, möjligen med en liten C++-kurs och därefter kastats in i MFC-kod. Det är inte kul.

Många vittnade om att de efter veckors möda och självstudier kommit fram till att de var sällsynt dumma i huvudet som inte kunde begripa hur det var tänkt. Då kunde jag trösta och meddela att det är helt normalt. MFC har den särskilda egenskapen att vara obegripligt. Ett särskilt skäl till det är att biblioteket utvecklades till stor del innan språket C++ ens var standardiserat – vilket som alla vet skedde först 1998.

Nu var det alltså läge att läsa på lite i den kurspärm jag själv skrivit. Det är oerhört irriterande att inte komma ihåg och inte omedelbart begripa det man själv skrivit. Man blir mycket missnöjd med sin hjärna. “Jag har fotografiskt minne men lite trubbel med framkallningen” kan man säga.

Men det var också fascinerande att efter tio år med .Net åter tvingas in i MFC. Det fascinerande är att se hur utvecklingen ofta går med stormsteg – fram och tillbaka.

I MFC är ett dokument i en windowsapplikation tre objekt: ett ramfönster, ett vyfönster, visuellt inuti ramfönstret, och ett dokumentobjekt. Det kallas document-view-architecture De tre objekten skapas av en objektfabrik kallad document template och kopplas samman. Därmed kan man ganska lätt bygga ut arkitekturen så att man har flera dokumentklasser som hanterar data på olika sätt, man kan koppla flera vyobjekt som visar samma dataobjekt på olika sätt, göra splitviews etc. Det är en listig och framsynt design, en variant av det sedermera klassiska designmönstret model-view-controller med rötter i GOF-mönstret Observer.

I .Net kom Windows Forms. Ett fönsterobjekt är ett fönster och man kan både rita i det och möblera det med kontroller. Kontrollerna genererar events (finns inte i MFC) som hanteras i fönsterklassen. Datat som ska visas läggs direkt i fönsterobjektet. Inte tillstymmelse till model-view-controller. För web kom ASP.Net Web Forms där formulärklassen både genererar HTML, hanterar events och innehåller datat. Inget model-view-controller.

Sedan kom nya modeflugan MVC, model-view-controller…

Ett exempel till: I Windows3-applikationer (ja jag vet, det är längesedan) gjorde man med MFC INI-filer. Textfiler med sparade inställningar enligt ett textformat som lätt kunde editeras manuellt. I Windows 95 blev det bannlyst. Inställningar ska sparas i registryt och inte editeras manuellt. MFC införde klasser för ändamålet.

Numera sparar vi inställningar i XML-filer. Textfiler enligt ett standardformat, som lätt kan editeras manuellt…