Hi, my name is Andy Bulka and I am a software developer.  I love design patterns and UML.

I have written several design patterns that you can use in your projects.  For example why not implement Relationship Manager in your next project and never worry about wiring pointers, backpointers and one-to many-relationships in your code again!  I also write about how to use various MVC based architectural patterns in your projects.

This website also holds my blog on UML and pattern based software development.  These blog entries are often based on presentations that I have given to live audiences at various programmer enthusiast user groups or conferences.

The Patterns Movement

Capturing hard-won software design experience in the form of design patterns and architectural patterns is a noble cause that everyone can contribute to.  You can contribute by writing patterns and maybe even coming to a Plop patterns conference. Basically when you see a software development technique a few times, and see that it isn't yet documented - write it up in Pattern format and give it a name!  A pattern is more than just a "tip" or technique though - a pattern represents an abstract idea - that can be implemented in various ways depending on your circumstances.

There are a couple of things I would like to see happen in the patterns world.

First, it would be nice if there was a single, authoritative repository of patterns. Yes an attempt has been made - a catalog book and and various websites - but nothing authoratative.  I'm starting a list of links here.

Secondly, it would be nice to have deep design pattern support in UML within all our favourite IDE's.  For example Netbeans has it all - coding, form design, UML and design pattern support - albiet not as integrated as it could be and not as polished as it could be. Update: Unfortunately Netbeans seems to have dropped UML support in recent builds?

If IDE's are not your cup of tea, then how about this: source code should have comment markers indicating where the patterns are, so that a reverse engineering tool can visualise not only the UML but also where the patterns are.  My own UML tool PyNSource will have such a feature - est. June 2011.

Further advancements are arguably executable UML and even the possibility of building software without code.  I muse a bit about this in my blog entry on software visualisation and my paper on design pattern tools

Patterns at all levels need to be core visual building blocks of IDE's, or at the very least, extractable from source code into some visual UML tool - rather than being design ghosts that float around, implicit, in our source code.

My Design Patterns

An unexpected error occurred.

mysql error: [145: Table './andypatterns5/PageSearchIndex' is marked as crashed and should be repaired] in EXECUTE("select p1.cID, pt.ctHandle from Pages p1 left join Pages p2 on (p1.cPointerID = p2.cID) left join PagePaths on (PagePaths.cID = p1.cID and PagePaths.ppIsCanonical = 1) left join PageSearchIndex psi on (psi.cID = if(p2.cID is null, p1.cID, p2.cID)) inner join CollectionVersions cv on (cv.cID = if(p2.cID is null, p1.cID, p2.cID) and cvID = (select cvID from CollectionVersions where cvIsApproved = 1 and cID = cv.cID)) left join PageTypes pt on pt.ctID = cv.ctID inner join Collections c on (c.cID = if(p2.cID is null, p1.cID, p2.cID)) left join CollectionSearchIndexAttributes on (CollectionSearchIndexAttributes.cID = if (p2.cID is null, p1.cID, p2.cID)) where 1=1 and cvName != '' and (ak_exclude_page_list = 0 or ak_exclude_page_list is null) and p1.cParentID = '43' and cvIsApproved = '1' and (p1.cIsTemplate = 0 or p2.cIsTemplate = 0) and ((select count(cID) from PagePermissionAssignments ppa1 inner join PermissionAccessList pa1 on ppa1.paID = pa1.paID where ppa1.cID = if(p2.cID is null, p1.cInheritPermissionsFromCID, p2.cInheritPermissionsFromCID) and pa1.accessType = 10 and pa1.pdID in (0) and pa1.peID in (1) and (if(pa1.peID = 5 and p1.uID <>0, false, true)) and (ppa1.pkID = 1 and cv.cvIsApproved = 1 or ppa1.pkID = 2)) > 0 or (p1.cPointerExternalLink !='' AND p1.cPointerExternalLink IS NOT NULL)) and ((select count(cID) from PagePermissionAssignments ppaExclude inner join PermissionAccessList paExclude on ppaExclude.paID = paExclude.paID where ppaExclude.cID = if(p2.cID is null, p1.cInheritPermissionsFromCID, p2.cInheritPermissionsFromCID) and accessType = -1 and pdID in (0) and paExclude.peID in (1) and (if(paExclude.peID = 5 and p1.uID <>0, false, true)) and (ppaExclude.pkID = 1 and cv.cvIsApproved = 1 or ppaExclude.pkID = 2)) = 0) and p1.cIsActive = '1' order by p1.cDisplayOrder asc limit 0,99 ")

< Back to Home