Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Bad Cocoa
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Delisa Mason
May 28, 2014
Programming
17k
12
Share
Bad Cocoa
How-to guide for building the kind of code you will deeply regret later
Delisa Mason
May 28, 2014
More Decks by Delisa Mason
See All by Delisa Mason
Pod for Great Good
kattrali
2
440
AppKit for iOS Developers
kattrali
5
880
Crafting iOS Dev Tools in Redcar, the Ruby Editor
kattrali
2
820
Other Decks in Programming
See All in Programming
横断組織出身のQAEがインプロセスQAEでつまずいたこと・活かせたこと
ty89
0
460
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
320
GitHub Copilot CLIのいいところ
htkym
2
1.2k
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.2k
Oxlintのカスタムルールの現況
syumai
5
900
誰も頼んでない機能を出荷した話
zekutax
0
150
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
410
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
370
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
1
240
AIエージェントと協働するCLI開発 — BunとOpenClawで学んだこと
yoshikouki
1
220
今さら聞けないCancellationToken
htkym
0
200
3Dシーンの圧縮
fadis
1
510
Featured
See All Featured
Practical Orchestrator
shlominoach
191
11k
WENDY [Excerpt]
tessaabrams
11
38k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Faster Mobile Websites
deanohume
310
31k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
120
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
370
Skip the Path - Find Your Career Trail
mkilby
1
130
So, you think you're a good person
axbom
PRO
2
2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
930
YesSQL, Process and Tooling at Scale
rocio
174
15k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
590
Transcript
Bad Cocoa How to write the code of deep regret
quickly and easily - @kattrali
Think Monolithic ensure changing one part of an app requires
changing them all
Long Selector is Best Selector
Test Private Stuff ensure every test will break during refactors
maximize the number of mocks, stubs, and performSelector() calls
Do Not Write Tests no worries, the compiler will catch
your bugs
Use Delegates with Callbacks If you don't need asynchronous callbacks
for synchronous code, you aren't trying hard enough -initWithDelegate:callback:
Subclass Subclass Subclass things will be easy when you need
to swap out superclasses sometime!
Categoriception Extend your own classes with several categories instead of
containing each unit of related functionality in a single class
Maximize Responsibilities Per Class ensure the difficulty of changing individual
components later
Safely assign many responsibilities using protocols @class MyController : NSObject
<MyControllerDelegate, Why, God, Please, Stop, WithTheProtocols>
Safely assign many responsibilities using protocols BONUS: Make each component
of a protocol optional, for maximum flexibility and verbosity (and less warnings!!)
Procrastinate on Performance always wait until you have a problem
before opening Instruments.app
if (@"Avoid Static Analysis") goto fail; goto fail;
Always Swing the Heaviest Hammer NSOperation and Core Data all
day every day - maximize boilerplate code (GCD and NSCoding don't real)
Make Code Styles Inconsistent increase the difficulty of using or
extending your project avoid code style tools like clang- format and Uncrustify
Do not write documentation especially avoid easy-to-use tooling like appledoc
Optimize early Reduce duplication as soon as possible, making code
less flexible later
When in doubt, add to AppDelegate There is no better
place to dump bits of code which do not belong anywhere and need access to application state certainly not new classes
#define over static variables get the most of your available
memory for your numbers, strings, and colors
Thank you!