jwcolby
jwcolby at colbyconsulting.com
Tue Apr 12 05:18:31 CDT 2011
Well, now we are all happy! ;) John W. Colby www.ColbyConsulting.com On 4/11/2011 5:59 PM, Shamil Salakhetdinov wrote: > <<< I doubt seriously that anyone uses your paradigm in .net.>>> > > http://fsharp.net ? > > -- > Shamil > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of jwcolby > Sent: 12 ?????? 2011 ?. 0:36 > To: Access Developers discussion and problem solving > Subject: Re: [AccessD] AccessD Digest, Vol 98, Issue 7 > > > I haven't found a reason why classes can't rely on properly crafted and > tested module-level functions. > > Do you program in .Net? Everything is an object. There is no "module", > though there can be static classes / functions. I haven't done a poll, but > I doubt seriously that anyone uses your paradigm in .net. > > John W. Colby > www.ColbyConsulting.com > > On 4/11/2011 4:09 PM, Kenneth Ismert wrote: >> John, >> >> I understand the reasoning and all however... because the code is no >> longer >>> contained within the object that needs it, you now open yourself up >>> to the old "I need to modify this method... oops... that change >>> breaks something else that uses the code". >>> >> >> It is always possible to over-factor, and merge two similar pieces of >> code together that really should be separate. In that case, you factor >> the code back into multiple pieces, and correct the dependencies. >> >> >>> Class programming exists for a reason. Placing code in the object >>> that needs the code exists for a reason. Black box programming >>> exists for a reason. The reason in many cases is to prevent exactly >>> this kind of interaction when we accidentally change a piece of code >>> used in many places and break one of those places. >>> >> >> I would submit that calling side-effect free functions from a class >> does not pierce the black box. The important things, state and access, >> are protected by the class. But the function can be anywhere: built-in >> VBA functions, Access application methods, or DAO library calls. You >> undoubtedly call these functions from within your classes. >> >> >>> Yes, there are instances where lots of different things need the >>> exact same code, and yes, I have been known to call module functions >>> from classes, but it truly is a questionable practice in most cases. >>> >> >> Test cases replace questionability with a guarantee of proper >> function. The function shouldn't define what it does -- the test cases >> should. If changes to a function break a test, then you know >> immediately that there is a problem. Functional unit testing guards >> against changes that would break dependent code. >> >> I haven't found a reason why classes can't rely on properly crafted >> and tested module-level functions. >> >> -Ken >> >> >>> >>> John W. Colby >>> www.ColbyConsulting.com >>> >>> On 4/11/2011 1:10 PM, Kenneth Ismert wrote: >>> >>>> John, All: >>>> >>>> I'm going to expand a little on what I'm trying to get at. This post >>>> really isn't advice on what you should do. And it certainly isn't >>>> criticism. >>>> >>>> I have been returning to the old Lisp idea of functional programming: >>>> libraries of functions that act only on their inputs and only return >>>> a result. The goal is 'side-effect-free' -- inputs are NEVER >>>> modified, and external variables are never referenced. If a function >>>> needs to return complex information, it returns either a type or an >>>> object. Database functions unavoidably have side-effects, but these >>>> are regarded as 'external' to the code, and are explicitly documented. >>>> >>>> The thing that surprised me was how well libraries play with objects. >>>> Libraries provide discrete, testable chunks of code that support any >>>> instance. Libraries separate functions into common-sense groups. >>>> Classes provide an instance wrapper over the libraries, stringing >>>> functions together to support the application. >>>> >>>> Plus, it is pretty easy to convert classes to this scheme while >>>> maintaining compatibility. >>>> >>>> The advantages became apparent when I refactored some of my early >>>> monolithic classes. These large, 'kitchen sink' classes had dozens >>>> of methods which mixed database, business, and application >>>> functionality. They were unwieldy, hard-to-understand, and >>>> hard-to-extend. I simply copied the class into a module, stripped >>>> out the instance stuff (properties and module-level variables), and >>>> turned the methods into side-effect-free functions. I then stripped >>>> out the code within the original class methods, turning them into >>>> wrappers calling library functions with their instance variables. >>>> >>>> The result: classes become lightweight, making their functionality >>>> much more obvious. Compatibility is maintained, but the new system >>>> is much easier to refactor and extend. >>>> >>>> The class on-top-of function approach is also a good answer to those >>>> who want to re-use your code, but can't because they need some >>>> method that is marked private in a class. They typically demand that >>>> all methods be made public, which is usually silly because the class >>>> designer has good reasons for limiting the public visibility of certain > methods or properties. >>>> >>>> But with a function library, you can have your cake and eat it, too. >>>> Classes >>>> hold the instance information, and interact with libraries in an >>>> instance-safe way, because the functions never modify their inputs. >>>> Others with different needs can call the functions directly, or >>>> write their own classes. Heck, I even find myself cramped by my own >>>> classes at times, and having the option to call underlying functions > directly has benefited me. >>>> >>>> Writing test code for functions is much easier than for complex >>>> class systems. Test code provides reasonable proof of reliability. >>>> Reliable complexity can only be built out of small, simple, >>>> understandable, and testable pieces. >>>> >>>> -Ken >>>> >>>> > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com >