I think Code Rage 6 had interesting stuff for almost everyone. Thanks to the time difference I could watch the sessions live that interested me most at home after work (as I was also very interested in the Q&A):
LiveBindings (Jim Tierney)
You know I have been complaining about the LiveBindings much in the past. So the questions I had prior to these sessions were: Did I miss something when I started working with them that affected my opinion so negatively and what is the general opinion about those bindings (as the reaction of other people)?
Jim started with some console applications explaining the expression framework beneath the LiveBindings. This session was very interesting and actually motivated me putting some work into the DSharp expressions to use them in the bindings (as I started developing those after I created the bindings). More about that later.
The other two sessions actually had no surprises for me. In fact the Q&A was more interesting. Unfortunately I forgot to save the log so I have to recapitulate that from memory.
Someone asked the question I was expecting: Why using LiveBindings over the traditional way since it looks very complicated setting them up (especially when working with grids and lists). It may be just my point of view but Jim did not have the killer argument. Sure, he mentioned the separation of GUI and BL but hey it is more than that.
If easy and painless to configure bindings can completely take care of your data flow. You just have to care about computing it. Think about how much code you have written in the past to show data, get it from one place to another and much more. Almost all of that code can be removed with a good binding system or at least moved to another place where it is not in the way. When asked about things like property references his answer saddened me - there are no plans for something like that. I still hope he just did not know about it.
Dependency Injection and Unit Testing (Nick Hodges)
On Wednesday I was excited about Nicks sessions and I have to say it again: very well done, Nick! I think these two sessions got people interested in learning more about dependency injection and as I have said in the past: recent releases since 2010 (with introducing the enhanced RTTI) over XE (first version that I did not want to throw out of the window when heavily using generics) to XE2 (more bugfixes and more features for the RTTI like virtual interface - also more on that later) gave us the possibilities other languages as C# or Java have had for ages. Using modern developing techniques to be more productive and raise the code quality.
His second session was about unit testing and I have to admit, I often am more excited about implementing new things instead of testing some existing things. That often has to do with hard to test code (like existing code that respects no clean code rules and is a total mess and has dependencies all over the place). When writing code with testability in mind it actually is fun to write tests, refactor your code and find eventual mistakes within seconds. But what about more advanced unit testing frameworks in Delphi? DUnit has been around for years and with new techniques there is also the need for a more advanced unit testing framework. There are several projects around and as Nick already mentioned it would be great to get the people together to build something great for the community. I just recently read about JBehave and immediately liked the idea.
Also with the possibility to use mocks (I am still a bit jealous that Delphi Mocks by Vincent Parrett is mentioned so often compared to DSharp) there are many ways to use the new features we got in the past 2 years.
RTTI (Robert Love)
As I have been exploring the RTTI since its release Robert could not tell me anything new but his sessions actually were very interesting and inspiring to those that have not touched the RTTI yet or at least not much. There are so many ways using it and actually I already cannot think of living without them.
Actually I found something on friday that was strange - especially with having in mind what Nick did. He put an entire class into the implementation part of a unit registering it to the container in the initialization part of the unit. I mentioned the dependency on the container in that case and tried something else: using TRttiContext.GetTypes to iterate all known types looking for attributes that tell to register that type. But it did not list the class in the implementation part of the unit. The class was not thrown out by the smart linker because it was actually used. It just seems to be the case that GetTypes does not find any types in the implementation part while GetType(...) works.
New things in DSharp
You might have noticed a lot of commits in the DSharp svn repository recently. I have refactored the collectionview classes (those responsable to bind lists of objects to controls) and added some more presenters to work with the DevExpress controls (grid and treelist). The expressions that started as experiment have been improved and are part of the binding framework now. I also moved some units to their own namespace (logging and aspects). And as I mentioned earlier one feature I am very proud of:
DSharp got full AOP for interfaces.
Some weeks ago I implemented AOP for virtual methods that made it possible to patch the VMT of any class at runtime making it possible to inject aspects into every instance of a class, its descendants and every new created class automatically. With the new classes and with support for attributes it is possible to declare aspects and apply them to virtual methods, interface methods and entire interfaces and classes.
I will explain that in detail in a following article as I am currently working on an adapter for the spring DI container to work with my composition and presentation model which I also will explain in detail soon. For now you can check out the sample and see how easy it can be using aspects like logging on your interfaces, implementing it once and using it everywhere without writing any line of code (well, except the attribute)!
AOP for interfaces! Logging each call and parameters passing in and out would be great.
ReplyDeleteBut what version of Delphi is targeted?
Works fine with XE (as I did my own implementation for TVirtualInterface), not tested with 2010 yet. And with the Logging aspect I already created it is possible to log all parameters and the Result (I did not implement logging of var and out parameters yet). I have to do some extensive testing on different calling conventions and that stuff but the basic things are working.
ReplyDeleteUnfortunately in Delphi 2010 the TMethodImplementation class does not exist which made it possible for me to implement the TVirtualInterface for Delphi XE without any assembler crafting which is beyond my knowledge.
ReplyDeleteI anyone feels like implementing it for Delphi 2010 go ahead.
I'd like to use your DSharp mocking framework, but it doesn't compile due to DSharp.Testing.Mock.Setup not being there. Can you upload that file?
ReplyDeleteI am so sorry I missed to commit that new file last month when I made changes. I will add it on monday as I currently have no access to that file.
DeleteExcellent, thanks!
DeleteI thought I was nuts when I first found out that GetTypes only returns public types (the ones in the interface sections of units; private ones in the implementation section are not listed with GetTypes). See for instance https://gist.github.com/jpluimers/6701746 There is a blog entry scheduled for http://wiert.me/2014/03/25/delphi-trtticontext-gettype-versus-trtticontext-gettypes-is-not-about-singular-versus-plural-but-about-all-versus-public-types that also explains the differences between getting qualified names from RTTI and from TClass itself.
ReplyDelete