-
Notifications
You must be signed in to change notification settings - Fork 0
/
secondBlog.html
275 lines (209 loc) · 10.3 KB
/
secondBlog.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>dwjdwj</title>
<meta name="HandheldFriendly" content="True" />
<meta name="MobileOptimized" content="320" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Lato:300|Open+Sans:700" />
<link rel="stylesheet" type="text/css" href="css/bootstrap.css">
<!-- 个人css-->
<link rel="stylesheet" href="css/mycss.css" />
<!--[if lt IE 9]>
<script src="js/html5shiv.js"></script>
<script src="js/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="page">
<!-- ==== START MASTHEAD ==== -->
<header class="masthead" role="banner">
<p class="logo"><a href="/"><img src="image/logo.jpg" alt="Le Journal" /></a></p>
<ul class="social-icon">
<li><em class="qq"></em><div>
dwj's qq is 270542958.Please with your purpose.
</div></li>
<li><em class="weixin"></em><div>
dwj's weixin id is dwjdwj1216.Please with your purpose.
</div></li>
<li><em class="weibo"></em><div>
dwj doesn't play weibo.
</div></li>
</ul>
<nav role="navigation">
<ul class="nav-main">
<li><a href="index.html">Home</a></li>
<li><a href="about.html">About</a></li>
<li><a href="messageBoard.html">Message Board</a></li>
</ul>
</nav>
</header>
<!-- end masthead -->
<div class="container clearfix">
<!-- ==== START MAIN ==== -->
<main role="main">
<section class="post">
<article>
<header>
<h1 class="entry-title">Objective-C之优雅的命名</h1>
<p class="meta"></p>
</header>
<div class="entry-content"><blockquote><p>There are only two hard things in Computer Science: cache invalidation and naming things.<br/>
在计算机科学中只有两件难事:缓存失效和命名。
<p align=right>— Phil Karlton</p>
</p></blockquote>
<p>计算机语言是人和计算机之间通讯的媒介。好的代码应该是就像人对计算机说话那样,自然而优雅。命名看上去是一件很简单的事,而往往越是简单的事越难做好,否则大师们也不会把命名看成是计算机界的难题了。如何把Objective-C这门计算机语言以优雅的方式“说”出,还是比较考验工程师对它的理解深度的。在苹果的SDK中有大量的API,我们可以从这些API中体会到一些命名的艺术。</p>
<!--more-->
<h2>减少缩写</h2>
<p><strong>命名缩写只用于通用专业术语,如<code>URL</code>,不可自创命名缩写,如<code>Ctr</code>、<code>Msg</code>。命名宁可长一些,也不要难于理解。</strong></p>
<p>是否在看别人代码时各种缩写而不知其所以然?简短的名字确实比较好,但不可滥用缩写导致失去可读性。</p>
<h2>过程化</h2>
<p><strong>动作发生之前用<code>Will</code>,发生之后用<code>Did</code>,询问是否发生用<code>Should</code>。</strong></p>
<p>每个处理都是有一定过程的,这个处理往往会产生一些通知和回调,好的命名必须要明确当前过程中的步骤。命名这些通知和回调时最好提供发生前后两个版本,如果发生前要回调确认,请用<code>Should</code>命名该回调,并返回一个<code>BOOL</code>值。</p>
<h2>名字空间</h2>
<p><strong>各种全局作用范围的函数,常量,类,枚举,结构等命名必须加命名前缀。</strong></p>
<p>Objective-C中没有C++那样的名字空间概念,也没有Java包名的概念,随着工程代码的增加,难免会出现名字冲突,因此全局作用范围的名字必须唯一。比较经典的做法就是加命名前缀。大多数人认为命名前缀只是在类的前面加几个大写字母,其实不仅仅如此。</p>
<ul>
<li><p>类型(类、枚举、结构)命名前要加相关模块前缀。</p>
<pre><code>UIView
NSString
CGRect
</code></pre></li>
<li><p>常量命名要加相关类型名前缀。</p>
<pre><code>UIApplicationDidFinishLaunchingNotification
CGRectZero
</code></pre></li>
<li><p>函数命名要加相关类型名前缀。</p>
<pre><code>CGRectMake
CGPointMake
</code></pre></li>
<li><p>枚举类型命名要加相关类名前缀,并且枚举值命名要加枚举类型前缀。</p>
<pre><code>typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
</code></pre></li>
</ul>
<p>做到以上几点几乎可以做到名字不会冲突。</p>
<h2>参数提示</h2>
<p><strong>方法命名时,每个参数前要加参数的名称提示。</strong></p>
<pre><code>- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
</code></pre>
<h2>对象命名</h2>
<p><strong>给一个带修饰的对象命名时要采用修饰+类型的方式,而不是先指定其类型。</strong></p>
<p>很多人喜欢把对象的类型放在对象的命名前面,从而来标识一个对象是什么类型,这很不符合Objective-C语言的特点,容易引起歧义,比如一个UILabel对象:</p>
<pre><code>titleLabel //表示标题的label,是UIlabel对象
labelTitle //label的标题?似乎是一个NSString?
confirmButton //确认按钮
buttonConfirm //不自然的命名,看上去像是按钮点击动作。
</code></pre>
<h2>方法命名符合语法</h2>
<p>大部分方法可以分成下面两类,而这两类往往被乱用。它们是:</p>
<ul>
<li>要什么</li>
<li>做什么</li>
</ul>
<p>“要什么”表示取得某个对象,要以名词作为方法的开头;“做什么”表示执行某种操作,要以动词作为方法开头。看看下面这个命名方式:</p>
<pre><code>- (XXItem *)itemNamed:(NSString *)name //Good. 意思清晰
- (XXItem *)findItemWithName:(NSString *)name //更像是一种操作,而不是返回一个对象。
</code></pre>
<p><code>findItemWithName</code>这个命名表示一种操作,而无需返回对象,比如它可以用于设置类的内部成员,比如:</p>
<pre><code>- (void)findItemWithName:(NSString *)name{
...
self.foundItem = xxx;
...
}
</code></pre>
<h4>get</h4>
<p>“要什么”往往被胡乱命名为<code>get</code>开头的方法。首先get是一个动词,所以它还是“做什么”或者说“做的是要什么”。那么get方法不要用于返回对象,但它可用于参数中返回。</p>
<pre><code>- (XXItem *)getItemAtIndex:(NSUInteger)index //Bad!! 不规范的命名
- (XXItem *)itemAtIndex:(NSUInteger)index //Good, 命名清晰
- (void)getItem:(XXItem **)outItem atIndex:(NSUInteger)index //比较符合规范,但第二种更好。
</code></pre>
<h2>可知性</h2>
<p><strong>回调时被调用者要知道其调用者</strong></p>
<p>可以在回调方法中第一个参数中加上调用者:</p>
<pre><code>- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- (void)buttonTapped:(UIButton*)sender
</code></pre>
<h2>常量还是宏</h2>
<p><strong>全局常量不可使用宏定义</strong></p>
<p>我们经常看到一些用宏定义的通知,关键字等。其实这么做是非常危险的,因为宏很可能被重定义,而且引用不同的文件可能会导致宏的不同,所以尽量使用<code>const</code>来定义常量。</p>
<h2>一些思考</h2>
<p>命名的好坏在开发中往往也不怎么重视,毕竟差的命名也不会影响程序逻辑。但是不好的命名在大项目中带来的隐形维护成本是相当高的,这些在项目开始时可能还很难察觉,而后来会陷入前仆后继的维护困境中。我们往往非常重视项目逻辑的复杂性,却不能好好的把“简单”的命名做好。其实,如果简单的东西都做不好,那么做出再复杂的东西那也是垃圾。</p>
</div>
<footer>
<p class="meta">
<span class="byline author vcard">作者: <span class="fn">谌启亮</span></span>
<time datetime="2014-08-06T19:21:03+08:00" pubdate data-updated="true">2014年08月06日</time>
</p>
</footer>
</article>
<footer class="footer">
<input type="button" name="Submit" onclick="javascript:history.back(-1);" value="返回上一页">
</footer>
</section>
</main>
<!-- end main -->
<!-- ==== START SIDEBAR ==== -->
<div class="sidebar">
<div class="about">
<h2>About Me</h2>
<img src="image/lufei.jpg" alt="" />
<p>
姓名:戴王炯
<br>
年龄:21岁
<br>
籍贯:浙江瑞安
<br>
就读学校:杭州电子科技大学
<br>
就读专业:软件工程专业
<br>
毕业时间:2017年6月
</p>
</div>
<div class="mod">
<h2>My Experiencing</h2>
<p>
初中就读于瑞安集云中学。
<br>
高中就读于瑞安十中。
<br>
大学就读于杭州电子科技大学软件工程专业。
<br>
曾参加浙江省电子商务大赛获三等奖,参加第六届中国创新创业服务外包大赛获三等奖。
</p>
</div>
<aside class="mod">
<h2>Popular rank</h2>
<ul class="links">
<li><a href="firstBlog.html" class="more">[转]深入理解JavaScript系列</a></li>
<li><a href="secondBlog.html" class="more">[转]Objective-C之优雅的命名</a></li>
</ul>
</aside>
<aside class="mod">
<h2>Recently Shared</h2>
<ul class="links">
<li><a href="firstBlog.html" class="more">[转]深入理解JavaScript系列</a></li>
<li><a href="secondBlog.html" class="more">[转]Objective-C之优雅的命名</a></li>
</ul>
</aside>
</div>
<!-- end sidebar -->
</div>
<!-- end container -->
<!-- ==== START PAGE FOOTER ==== -->
<footer role="contentinfo" class="footer">
<p class="legal"><small>© 2015 dwjdwj. All Rights Reserved.</small></p>
</footer>
<!-- end page footer -->
</div> <!-- end page -->
</body>
</html>