Better Software - November 2008 - (Page 14) Code Craft Encapsulation and Vampires by Kevlin Henney Encapsulation—it’s all about declaring data in classes private, right? Well, not quite. Encapsulation has a deeper meaning with more profound implications for your code than just “declare your data private,” although this is what text books and training courses have dumbed it down to mean. Consequently, in considering encapsulation, many programmers look no further than the presence or absence of the keyword “private.” Encapsulation is a matter of degree and sensibility; it is not simply a binary state enabled by sprinkling private over your code. What, then, does it mean to encapsulate? Perhaps the most useful and revealing definition is to be found not in a book on software development but in an ordinary dictionary, the New Oxford Dictionary of English: encapsulate • Enclose (something) in or as if in a capsule. • Express the essential feature of (someone or something) succinctly. • Enclose (a message or signal) in a set of codes which allow use by or transfer through different computer systems or networks. • Provide an interface for (a piece of software or hardware) to allow or simplify access for the user. So encapsulation involves a boundary, the succinct expression of something’s essence as an abstraction, and interposition of an interface to simplify access. Data privacy is simply one effect of encapsulation, but it is not the only one. And, as an effect, it should not be confused with a cause. typedef std::vector recently_used_list; Listing 1 Private Parts Let’s consider an example problem from a previous Code Craft column (“Programming with GUTs” July/August 2008), that of a recently used list. However, rather than use the example as a means of focusing on unit-test quality, let’s take a slightly different journey. For variety, let’s walk through it in C++ rather than C#. Using C++ gives us the excuse to start off in C+ (C++ used as a better C) and allows us to take in a couple of other sights en route. The conclusions drawn apply to the same coding habits when practiced in other languages, but C++ serves to amplify and emphasize the choices made. Listing 2 To start with, we can consider a recently used list to be list. Recently used lists aren’t just arbitrary sequences; they are a sequence of strings. Everyone’s favorite default sequence container is vector, which gives us the modest starting point both stack-like and set-like. They maintain an order of insertion, but they also preserve the uniqueness of their elements. in listing 1. Listing 2 shows a refinement that attempts to take this into The pro: We’ve given the concept a name by which it can be used. The con: It doesn’t actually behave like a recently used account. The pro: We have associated an operation with the struct recently_used_list { void insert(const std::string & most_recent) { std::vector ::iterator found = std::find( elements.begin(), elements.end(), most_recent); if(found != elements.end()) elements.erase(found); elements.insert( elements.begin(), most_recent); } std::vector elements; }; 14 BETTER SOFTWARE NOVEMBER 2008 www.StickyMinds.com ISTOCKPHOTO http://www.nxtbook.com/nxtbooks/sqe/bettersoftware0708/index.php?startid=16 http://www.nxtbook.com/nxtbooks/sqe/bettersoftware0708/index.php?startid=16 http://www.StickyMinds.com
Table of Contents Feed for the Digital Edition of Better Software - November 2008 Better Software - November 2008 Contents Mark Your Calendar Contributors eLightenment Technically Speaking Code Craft Test Connection Management Chronicles Getting Agile with User-Centered Design Google Web Toolkit Simple Summaries of Complex Projects Product Announcements 10 Things You Might Not Know About … The Last Word Ad Index Better Software - November 2008 Better Software - November 2008 - (Page Intro) Better Software - November 2008 - (Page bellyband1) Better Software - November 2008 - (Page bellyband2) Better Software - November 2008 - Better Software - November 2008 (Page Cover1) Better Software - November 2008 - Better Software - November 2008 (Page Cover2) Better Software - November 2008 - Better Software - November 2008 (Page 1) Better Software - November 2008 - Better Software - November 2008 (Page 2) Better Software - November 2008 - Contents (Page 3) Better Software - November 2008 - Mark Your Calendar (Page 4) Better Software - November 2008 - Mark Your Calendar (Page 5) Better Software - November 2008 - Contributors (Page 6) Better Software - November 2008 - Contributors (Page 7) Better Software - November 2008 - eLightenment (Page 8) Better Software - November 2008 - eLightenment (Page QA1) Better Software - November 2008 - eLightenment (Page QA2) Better Software - November 2008 - eLightenment (Page 9) Better Software - November 2008 - eLightenment (Page 10) Better Software - November 2008 - eLightenment (Page 11) Better Software - November 2008 - eLightenment (Page 12) Better Software - November 2008 - Technically Speaking (Page 13) Better Software - November 2008 - Code Craft (Page 14) Better Software - November 2008 - Code Craft (Page 15) Better Software - November 2008 - Code Craft (Page 16) Better Software - November 2008 - Code Craft (Page 17) Better Software - November 2008 - Test Connection (Page 18) Better Software - November 2008 - Test Connection (Page 19) Better Software - November 2008 - Management Chronicles (Page 20) Better Software - November 2008 - Management Chronicles (Page 21) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 22) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 23) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 24) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 25) Better Software - November 2008 - Google Web Toolkit (Page 26) Better Software - November 2008 - Google Web Toolkit (Page 27) Better Software - November 2008 - Google Web Toolkit (Page 28) Better Software - November 2008 - Google Web Toolkit (Page 29) Better Software - November 2008 - Google Web Toolkit (Page 30) Better Software - November 2008 - Google Web Toolkit (Page 31) Better Software - November 2008 - Google Web Toolkit (Page 32) Better Software - November 2008 - Google Web Toolkit (Page 33) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 34) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 35) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 36) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 37) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 38) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 39) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 40) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 41) Better Software - November 2008 - Product Announcements (Page 42) Better Software - November 2008 - Product Announcements (Page 43) Better Software - November 2008 - Product Announcements (Page 44) Better Software - November 2008 - Product Announcements (Page 45) Better Software - November 2008 - 10 Things You Might Not Know About … (Page 46) Better Software - November 2008 - The Last Word (Page 47) Better Software - November 2008 - Ad Index (Page 48) Better Software - November 2008 - Ad Index (Page Cover3) Better Software - November 2008 - Ad Index (Page Cover4)
For optimal viewing of this digital publication, please enable JavaScript and then refresh the page. If you would like to try to load the digital publication without using Flash Player detection, please click here.