{"id":331,"date":"2007-04-25T16:48:19","date_gmt":"2007-04-25T23:48:19","guid":{"rendered":"http:\/\/www.red-sweater.com\/blog\/331\/brent-simmons-on-large-cocoa-projects"},"modified":"2007-04-26T12:14:06","modified_gmt":"2007-04-26T19:14:06","slug":"brent-simmons-on-large-cocoa-projects","status":"publish","type":"post","link":"https:\/\/redsweater.com\/blog\/331\/brent-simmons-on-large-cocoa-projects","title":{"rendered":"Brent Simmons On Large Cocoa Projects"},"content":{"rendered":"<p>Brent Simmons shares a good deal of wisdom in <a href=\"http:\/\/inessential.com\/?comments=1&amp;postid=3405\">his post<\/a> about managing a large-ish Cocoa project. In particular he&#8217;s referring to <a href=\"http:\/\/www.newsgator.com\/NGOLProduct.aspx?ProdID=NetNewsWire\">NetNewsWire<\/a>, but his advice is especially pertinent to me now that I own and maintain a rather substantial number of source files that were designed and authored by Brent (<a href=\"http:\/\/www.red-sweater.com\/marsedit\/\">MarsEdit<\/a>, for anybody late to the party).<\/p>\n<p>\nI love the emphasis on &#8220;researchability.&#8221; He points to the fact that projects of a certain size become impossible to keep in your head. So when you go to work on any particular subsection of the app, you need to be confident that you&#8217;ll find your balance quickly so you can get on with your work.\n<\/p>\n<p>\nIn particular, I liked the suggestion that weak binding in the form of notifications or key-value observing can be detrimental to researchability. Brent notes that the weak binding makes it difficult to mentally follow the source code, so it can be prudent to strongly bind classes that are otherwise useless without each other.\n<\/p>\n<p>\nHe also reminds us of some good IDE habits for maintaining code. I was glad to be reminded that the function popup in Xcode is keyboard invokable (as Brent says, &#8220;Every time you touch the mouse, God kills a kitten.&#8221;). This is very cool because with keyboard navigation of the menu you can quickly jump to a method by name.\n<\/p>\n<p>\nAnother tip he reminds us about is the &#8220;Open Quickly&#8221; option (cmd-shift-D). I use this feature frequently, but not in the way he describes. It&#8217;s infuriating that when you want to &#8220;open quickly,&#8221; the dialog for typing in the name of a source file doesn&#8217;t tab-complete. Imagine how much more powerful it would be if you could type &#8220;MyPic&lt;tab>&#8221; and get &#8220;MyPictureThingyController.h&#8221;. Having to type the whole name of a file in removes most of the quickness. When I use the shortcut, I do so with the cursor inside the quotes or brackets of an include line. When invoked in this context, Xcode is smart and just jumps to the desired header file.\n<\/p>\n<p>\n<strong>Update:<\/strong> Quentin over at Rogue Amoeba noticed this shortcoming a long time ago, and developed an Xcode plugin to address the problem. Check out <a href=\"http:\/\/www.rogueamoeba.com\/utm\/posts\/Random\/XcodeOpenQuicker-2007-04-26-14-17\">Xcode Open Quicker<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Brent Simmons shares a good deal of wisdom in his post about managing a large-ish Cocoa project. In particular he&#8217;s referring to NetNewsWire, but his advice is especially pertinent to me now that I own and maintain a rather substantial number of source files that were designed and authored by Brent (MarsEdit, for anybody late [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,15,5],"tags":[],"class_list":["post-331","post","type-post","status-publish","format-standard","hentry","category-links","category-programming","category-xcode"],"_links":{"self":[{"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/posts\/331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/comments?post=331"}],"version-history":[{"count":0,"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/posts\/331\/revisions"}],"wp:attachment":[{"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/media?parent=331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/categories?post=331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/redsweater.com\/blog\/wp-json\/wp\/v2\/tags?post=331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}