Hi, this is Alice Home


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

Hexo(三) 添加微信二维码

发表于 2018-07-21 | 分类于 Hexo

添加微信二维码,在文章的最后,方便阅读文章的人联系你!
这个功能和上一篇中的设置最后的结束语类似,用到的步骤是上一篇的第三步.

Step1:修改 _config.yml

全局搜索 WeChat ,可以搜索到如下的语句,下面展示的时候删除了注释的代码。 WechatIMG13.jpeg 是图片的名字。

1
2
3
4
5
# Wechat Subscriber
wechat_subscriber:
enabled: true
qcode: /uploads/WechatIMG13.jpeg
description: 微信公众号还没弄好,先放上二维码吧!

Step2:添加图片

从微信中获取到二维码,然后添加

1
/Maple/source/uploads

博客 source 目录下的 uploads(如果没有这个目录新建一个就是了),然后将图片拷贝进去,测试即可。效果看下面结束语之后

Hexo(二) 添加‘文本结束‘ 标记

发表于 2018-07-21 | 分类于 Hexo

之前在写文章时候,总会在写完的地方,手动写一个 Done 字,标志着这篇博客结束了,这次通过设置在每篇文章中自动添加结束标志,样式如下,看文章的底部就可以了,对,就是这样式的。

这种结束标识如何实现的呢?

Step1:创建文件 passage-end-tag.swig

进入到博客目录的主题目录中:

1
$ /Users/maple/Maple/themes/next/layout/_macro

在此目录下创建文件:

1
2
3
4
5
6
7
8
$ touch passage-end-tag.swig
$ vim passage-end-tag.swig
#添加内容
<div>
{% if not is_index %}
<div style="text-align:center;color: #ccc;font-size:14px;">-------------本文结束<i class="fa fa-paw"></i>再接再厉-------------</div>
{% endif %}
</div>

Step2:生效

打开 post.swig 文件:

1
$vim /Users/maple/Maple/themes/next/layout/_macro/post.swig

搜索 end post 然后将下图的红色框内代码粘贴上图

代码如下:

1
2
3
4
5
<div>
{% if not is_index %}
{% include 'passage-end-tag.swig' %}
{% endif %}
</div>

Step3: 配置 _config.yml

在文件最底下添加代码:

1
2
3
# 文章末尾添加“本文结束”标记
passage_end_tag:
enabled: true

完成之后通过 hexo g 和 hexo d 验证一下即可

Hexo (一) fork me on github

发表于 2018-07-20 | 分类于 Hexo

样式

如上图所示,在 next 主题的基础上,实现 for me on GitHub 的功能,点击右上角的 GitHub 图标可以直接跳转到你的 GitHub 主页上。

实现

Step 1:

1
2
3
4
5
# maple @ iMac in ~/Maple/themes/next/layout [0:04:41]
$ ls
_custom _partials archive.swig page.swig tag.swig
_layout.swig _scripts category.swig post.swig
_macro _third-party index.swig schedule.swig

进入到你的 Hexo 目录,然后找到文件 _layout.swig 通过文本编辑器打开

Step 2:

找到 _layout.swig 中如下代码(全局搜索:headband )

1
2
3

<div class="{{ container_class }} {% block page_class %}{% endblock %} ">
<div class="headband"></div>

然后打开:GitHub Ribbons 或者 GitHub Corners

复制图标样式旁边的代码粘贴到上面的代码下面,效果如下

1
2
3
4
5
<div class="{{ container_class }} {% block page_class %}{% endblock %} ">
<div class="headband"></div>

<a href="https://github.com/AliceHome" class="github-corner" aria-label="View source on Github"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#64CEAA; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px)
{.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>

step 3:

1
2
# hexo g
# hexo s

验证效果,Done!

感谢简书大神:
hexo的next主题个性化教程:打造炫酷网站

Hexo(零) 问题列表

发表于 2018-07-19 | 分类于 Hexo

Cannot set property ‘lastIndex’ of undefined

问题详细:

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
 maple @ iMac in ~/Maple [11:05:09]
$ hexo g
INFO Start processing
FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
TypeError: Cannot set property 'lastIndex' of undefined
at highlight (/Users/maple/Maple/node_modules/highlight.js/lib/highlight.js:511:35)
at /Users/maple/Maple/node_modules/highlight.js/lib/highlight.js:561:21
at Array.forEach (<anonymous>)
at Object.highlightAuto (/Users/maple/Maple/node_modules/highlight.js/lib/highlight.js:560:40)
at /Users/maple/Maple/node_modules/hexo-util/lib/highlight.js:117:25
at highlight (/Users/maple/Maple/node_modules/hexo-util/lib/highlight.js:120:7)
at highlightUtil (/Users/maple/Maple/node_modules/hexo-util/lib/highlight.js:22:14)
at /Users/maple/Maple/node_modules/hexo/lib/plugins/filter/before_post_render/backtick_code_block.js:62:15
at String.replace (<anonymous>)
at Hexo.backtickCodeBlock (/Users/maple/Maple/node_modules/hexo/lib/plugins/filter/before_post_render/backtick_code_block.js:14:31)
at Hexo.tryCatcher (/Users/maple/Maple/node_modules/bluebird/js/release/util.js:16:23)
at Hexo.<anonymous> (/Users/maple/Maple/node_modules/bluebird/js/release/method.js:15:34)
at /Users/maple/Maple/node_modules/hexo/lib/extend/filter.js:68:35
at tryCatcher (/Users/maple/Maple/node_modules/bluebird/js/release/util.js:16:23)
at Object.gotValue (/Users/maple/Maple/node_modules/bluebird/js/release/reduce.js:155:18)
at Object.gotAccum (/Users/maple/Maple/node_modules/bluebird/js/release/reduce.js:144:25)
at Object.tryCatcher (/Users/maple/Maple/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/maple/Maple/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/Users/maple/Maple/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromiseCtx (/Users/maple/Maple/node_modules/bluebird/js/release/promise.js:606:10)
at Async._drainQueue (/Users/maple/Maple/node_modules/bluebird/js/release/async.js:138:12)
at Async._drainQueues (/Users/maple/Maple/node_modules/bluebird/js/release/async.js:143:10)

修改方案:

在 _config.yml 修改 auto_detect: 的 true 为 false

1
2
3
4
5
highlight:
enable: true
line_number: true
auto_detect: false
tab_replace:

红黑树

发表于 2018-07-03

红黑树,简称 R-B Tree,它是一种二叉查找树。

细说 iOS 刷新控件(二)

发表于 2018-07-02 | 分类于 刷新控件

这一片介绍 MJRefresh 刷新控件原理,也不知道需要几篇。

MJRefresh 如何添加头部试图 ?

答:通过类目和 runtime 方式

1
2
3
4
5
6
7
8
9
10
#import <UIKit/UIKit.h>

@class MJRefreshHeader, MJRefreshFooter;

@interface UIScrollView (MJRefresh)
/** 下拉刷新控件 */
@property (strong, nonatomic) MJRefreshHeader *mj_header;
/** 上拉刷新控件 */
@property (strong, nonatomic) MJRefreshFooter *mj_footer;
@end

文件 UIScrollView+MJRefresh 中为 UIScrollView 添加了 MJRefresh 的类目
接下来看一下 UIScrollView+MJRefresh.m 中设置头部视图的实现,这里本质上是通过 runtime 的 objc_setAssociatedObject 函数为 UIScrollView 绑定了 mj_header 属性对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#pragma mark - header
static const char MJRefreshHeaderKey = '\0';
- (void)setMj_header:(MJRefreshHeader *)mj_header
{
if (mj_header != self.mj_header) {
// 删除旧的,添加新的
[self.mj_header removeFromSuperview];
[self insertSubview:mj_header atIndex:0];

// 存储新的
objc_setAssociatedObject(self, &MJRefreshHeaderKey,
mj_header, OBJC_ASSOCIATION_RETAIN);
}
}

- (MJRefreshHeader *)mj_header
{
return objc_getAssociatedObject(self, &MJRefreshHeaderKey);
}

从上面代码看到,当设定头部视图的时候,首先判断是否一致,然后删除之前的透视图,然后将传入的头部师徒插入到位置 0 ,然后通过 objc_setAssociatedObject() 函数将 mj_header 绑定成 UIScrollView 的对象,同理,当获取头部试图的时候,通过 objc_getAssociatedObject() 就可以得到头部视图 footer 也是一样的操作。

总结:

  1. 下拉刷新的 UI 控件是 UITableView 和 UICollectionView,所以对它们共有的父控件 UIScrollView 采取添加 header 的操作
  2. 类目拓展功能在 iOS 封装组件中常用,比如 SDWebImage 中 UIImageView 的类目方式使用该框架设置图片
  3. 类目不能添加属性,但是可以通过 runtime 的方式做到添加属性,在实现 set/get 放阿飞即可

细说 iOS 刷新控件(一)

发表于 2018-07-01 | 分类于 刷新控件

我是 demo 链接,欢迎点击!!!

刷新数据,是 iOS 开发过程中一个重要的操作,操作频率也非常高!现在一般刷新控件都直接使用 MJRefresh 这个第三方控件,后面将会详细讲解其原理,这一篇首先介绍系统的刷新控件 —— UIRefreshControl

UIRefreshControl

UITableViewController iOS 6 之后的属性 refreshControl

1
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;

这是 UITableViewController 中的声明,由此可知:

  1. refreshControl 是 UITableViewController 的属性,我们如果使用这个控件,就必须使用 UITableViewController;
  2. 后面的 NS_AVAILABLE_IOS(6_0) 说明是 iOS 6 才会支持这个控件

UIRefreshControl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

NS_ASSUME_NONNULL_BEGIN

NS_CLASS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED @interface UIRefreshControl : UIControl

/* The designated initializer
* This initializes a UIRefreshControl with a default height and width.
* Once assigned to a UITableViewController, the frame of the control is managed automatically.
* When a user has pulled-to-refresh, the UIRefreshControl fires its UIControlEventValueChanged event.
*
*/
- (instancetype)init;
@property (nonatomic, readonly, getter=isRefreshing) BOOL refreshing;
@property (null_resettable, nonatomic, strong) UIColor *tintColor;
@property (nullable, nonatomic, strong) NSAttributedString *attributedTitle UI_APPEARANCE_SELECTOR;

// May be used to indicate to the refreshControl that an external event has initiated the refresh action
- (void)beginRefreshing NS_AVAILABLE_IOS(6_0);
// Must be explicitly called when the refreshing has completed
- (void)endRefreshing NS_AVAILABLE_IOS(6_0);

@end

NS_ASSUME_NONNULL_END

这是 UIRefreshControl 的 API,从中可以看出:

  1. 通过 init 方法创建的控件有默认的 height 和 width
  2. 在 UITableViewController 中这个控件 frame 会被自动管理
  3. 当执行下拉刷新动作的时候,UIRefreshControl 会被 UIControlEventValueChanged 事件触发,所以我们可通过 addTarget 监听这个状态来执行相应的刷新方法

关于该 API 其他的地方可以通过其他的文章查看,比如 NS_ASSUME_NONNULL_BEGIN、NS_ASSUME_NONNULL_END 这一对宏,以及 null_resettable、nullable 这中关键字,还有 UI_APPEARANCE_SELECTOR

UITableViewController 中刷新控件具体使用参照代码:https://github.com/AliceHome/iOSRefreshDemo

思考

这里控件的使用是非常简单方便的,如果只是简单实现刷新的功能,或者修改下文案可以直接使用这个控件。当然,如果不满足当前项目开发需求,比如要做一些本地化的效果,那么就需要自定义刷新控件了,当然可以直接参照上面开发的 API 去设计自己的刷新控件。除此之外,就是使用其他第三方控件,比如 MJRefresh、EGORefresh(这个库当前也是挺好用的,但是不知不觉就被遗忘了)

下期预告:将介绍第三方 MJRefresh
未来设想:如果有机会有时间可以参照系统的 API 自己实现以下 refresh control

Cocopods 公共仓库创建

发表于 2018-06-18

先前工作的时候通过私有的 Git 搭建了 CocoaPods 仓库,然后用到的控件或者自定义仓库就直接使用,甚至将业务模块也做成了仓库,这样做的好处是集成的时候非常方便,但是大部分都做成了私有仓库,Git 地址都是私有地址,这样就会出现一个问题,就是这些私有仓库一但不在公司网络中便没有办法操作了,所以这次就一些非业务的控件直接做成公共的仓库,在这里坐下记录:

模板搭架工程框架

pod lib create 是 CocoaPods 提供的创建仓库模板的命令,可以通过设置 url 的方式通过模板来配置模板,也可以使用默认的(就是不适用url),然后通过选项来配置模板仓库。

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
pod lib create MLRouterAction
Cloning `https://github.com/CocoaPods/pod-template.git` into `MLRouterAction`.
Configuring MLRouterAction template.

------------------------------

To get you started we need to ask a few questions, this should only take a minute.

If this is your first time we recommend running through with the guide:
- https://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and click links to open in a browser. )


What platform do you want to use?? [ iOS / macOS ]
> iOS

What language do you want to use?? [ Swift / ObjC ]
> ObjC

Would you like to include a demo application with your library? [ Yes / No ]
> Yes

Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None

Would you like to do view based testing? [ Yes / No ]
> Yes

What is your class prefix?
> ML

Running pod install on your new library.

Analyzing dependencies
Fetching podspec for `MLRouterAction` from `../`
Downloading dependencies
Installing FBSnapshotTestCase (2.1.4)

LeetCode(五) 两数之和

发表于 2018-06-15 | 分类于 LeetCode

代码链接
题目题目链接

两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

有三种解决方案:

  1. 暴力法
  2. 两遍 Hash
  3. 一遍 Hash

方案一: 暴力法

这种方法很简单,通过两重遍历,找到 x + y = target 的 index ,然后将 index 加入数组返回即可

1
2
3
4
5
6
7
8
9
10
11
12
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {

for i in 0 ..< nums.count {
for j in i + 1 ..< nums.count {
if nums[i] + nums[j] == target {
return [i,j]
}
}
}

return []
}

复杂度分析:

  1. 时间复杂度: O(n²)
  2. 空间复杂度: O(1)

这种方案在 LeetCode 的时间限制下是不能通过的。

方案一:两遍 Hash

第一种方案固然可以解决问题,但是时间复杂度太大,所以我们需要降低时间复杂度。一般而言,都是通过空间换时间,所以这里需要一种数据结构可以快速查找到 target - nums[i] 的值是否在 nums 中,字典(hash) 就是最好的数据结构:

  1. 首先,通过遍历的方式,将 nums[i] 作为 key , i 作为 value 添加到字典中 map[Int:Int]
  2. 遍历 nums,通过检索 target - nums[i] 是否在 map 中,如果在就直接返回 i 和 map 中的 value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var map : [Int : Int] = [Int : Int]()

for i in 0 ..< nums.count {
map[nums[i]] = i
}

for i in 0 ..< nums.count {
var result = target - nums[i]
if let temp = map[result] {
return [i, temp]
}
}
return []
}

复杂度分析:

  1. 时间复杂度: O(n)
  2. 空间复杂度: O(n)

结果:

方案二:一遍 Hash

上面的方案,我们可以发现,即使一开始 map 没有值,只要我们遍历的时候添加上,后面找到另一个值就会回头对比,所以一遍遍历,一遍向 map 中添加值,然后继续遍历,一次 hash 就可以了

1
2
3
4
5
6
7
8
9
10
11
var map : [Int : Int] = [Int : Int]()

for i in 0 ..< nums.count {
var result = target - nums[i]
if let temp = map[result] {
return [i, temp]
}

map[nums[i]] = i
}
return []

复杂度分析:

  1. 时间复杂度: O(n)
  2. 空间复杂度: O(n)

结果:

重构改善既有代码的设计

发表于 2018-06-14 | 分类于 Book

这本书已经看过一遍了,还做过一个分享,想来想去还是做下记录,这样更加熟悉些。

初读之感

其实这本书是经典早已知道,随便看看一些列了计算机必读书目的地方都有这本书,我记得第一次读的时候没觉得怎样,但是当我看别人的代码的时候(当然是一些开源的项目)我发现了一些地方竟然与书中的描述不谋而合。说实话,读源码是一件痛苦的事情,你是在沙漠中寻找水源,而这不谋而合的一瞥便是一席绿洲之地,沁人心脾!这种感觉很棒,这也促使了我再次深入的去细细阅读这本书。

这本书是需要有基础才可以阅读的,我觉得应该有的基础如下:

  • 懂得面向对象思想,至少应该写过几个类,类的每一分部的都要知道,比如构造方法、工厂方法、实例变量
  • 对面向对象的三大特征有一定的理解,不仅仅是知道,最好可以直接通过代码演示出来,个人觉得不要用 Objective-C 来演示,最好是 Java 、 C++ 或者是 Swift,因为 Objective-C 中的许多叫法和这本书中的叫法真的不一样
  • 懂得一些设计模式,不需要深入理解,但是至少对一些名词要有一些认知,可以看看 《大话设计模式》当然 F4 也未尝不可
  • 熟练的写过一两个项目,整体的布局都要知道

如果对上面这些东西没有认知的话,这本书还是不要读了,因为你真的会不明白他的含义的。

这是一本书需要入乡随俗的书籍,因为书中列举了大量的自造(或者大家达成共识,而你不知道这个共识)的方法词汇,大部分的地方就直接用了着样的名词来进行描述,所以如果你不知道这种名词的话,真的很难阅读下去,比如这一句 ”如果你发现继承体系中的某些类没有存在的必要,可以用 Collapse Hierarchy(344)将它们移除。“ 我第一次读到这里的时候,瞬间不想再读下去了,因为好多地方都是这么叙述的,真心看不懂怎么一个意思,其实这个和看源码也差不多,就是你读到了一个函数调用,然后再去看看函数里面实现了什么东西,如果见名知意的话,那么就可以继续往后阅读,如果不知道那么你就要进入函数,当然进入函数之前你要存储上下文,阅读的话你就需要用书签或者脑袋来存储上下文了。

Collapse Hierarchy(344)这个的意思是:超类和子类没有太大的区别,那么就可以将子类去掉,直接使用超类,反过来也一样,只要合二为一就可以了,译文叫做——折叠继承体系

总览

先看书的大体结构:

  • 去了书皮,第一页便是重构列表,根据字母顺序排列,第一个是 Add Parameter(添加参数)
  • 全书共 15 章节,其实感觉书本的目录便是一个学习资源从中阅读你就知道了这是什么
  • 前五章:什么是重构、那些地方需要重构(坏味道)、测试体系和重构列表
  • 第六章-第十一章,这一部分是具体的重构方法:组织、简化函数以及组织数据和处理逻辑数据等,这部分就是学习的具体细节了,深究体会
  • 最后是 12 ~ 15 这部分就是尾声了,可以放松下浏览一下

章节阅读记录

下面这部分就是阅读记录了,读取每一章节将我体会所得做以记录:

第 11 章 处理概括关系

这一章节一共 12 个技巧,

Pull Up Field

两个子类拥有相同的字段,那么需要将着两个子类的相同字段移至超类。

具体做法就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
st=>start: Pull Up Field 重构:>http://www.google.com[blank]
e=>end:>http://www.google.com
op1=>operation: 观察并记录各个子类之间相同字段
sub1=>subroutine: 统一字段名字
cond=>condition: 相同字段名字是否一致?:>http://www.google.com
io1=>operation: 编译测试
io2=>operation: 在超类中新建一个字段
io3=>operation: 移除子类字段
io4=>operation: 编译测试
io4=>operation: 选择性对超类新建字段使用 Self Encapsulate Field
st->op1->cond
cond(yes)->io1->io2->io3->io4->e
cond(no)->sub1(right)->op1

注意事项:

  1. 观察两个或者多个子类对这个字段行为是否一致,或者大体相似才能用这个技巧来进行优化
  2. 如果子类的字段的是 private 的,那么提升到超类之后必须是 protected
  3. 针对超类新建字段使用 Self Encapsulate Filed(171), 就是为了解耦,通过封装方法来访问字段值,常见方式就是 setter 和 getter 方法

一句话:将子类字段提升到父类,减少了代码重复,降低了代码修改复杂度

Pull Up Method

有些函数,在各个子类中产生完全相同的结果,可以将该函数移动到超类中。

具体做法:

1
2
3
4
5
6
7
8
9
st=>start: Pull Up Method 重构:>http://www.google.com[blank]
e=>end:>http://www.google.com
op1=>operation: 检查待提升函数,确定它们行为是否一致
io1=>operation: 修改不一致的地方,编译测试
io2=>operation: 在超类中新建一个函数,复制子类函数到父类
io3=>operation: 移除子类函数内容,每次一处都需要测试
io4=>operation: 编译测试
io4=>operation: 观察该函数的调用者,看看是否可以改为超类类型的帝乡
st->op1->io1->io2->io3->io4->e

一句话: 将子类中行为完全相同的函数提升到父类中,即使不完全相同也可以先调整让其相同再进行提升操作

Pull Up Constructor Body

你在各个子类中拥有一些构造函数,它们的本体几乎完全一致。
在超类中新建一个构造函数,并在子类构造函数中调用它

这个技巧主要是针对构造函数的,因为构造函数是创建对象的函数,所以比较特殊,在这里就有了这么一个专门处理的技巧。

具体操作:

  • 在超类中定义一个构造函数
  • 将子类构造函数中的共同代码搬迁到超类的构造函数中:
    • 被搬迁的可能是子类构造函数的全部内容,这种比较好操作
    • 如果不是全部,设法将共同代码搬移到构造函数起始处,然后再复制到父类构造函数中
  • 将子类中共同代码删掉,改调动新建父类的构造函数
  • 测试(如果日后子类构造函数中再出现共同代码,可以首先使用 Extract Method 将那一部分单独提炼到一个独立函数中,然后使用 Pull Up Method 将该函数上移。

阅读技巧

这里记录了在阅读这本的时候的小技巧:

  • 不要阅读电子版本的,你会崩溃的
  • 阅读之前准备几个书签放在旁边
  • 不要吝啬,不要懒惰,看到不明白的技巧名字就直接翻到那一页看看是什么意思,不明白不要紧
  • 书中代码都是 Java 的,最好用 Java 写过项目

读书心得

心得一:如果你不知道怎么把你的代码写好那就看看这本书

当你在写完代码之后,不知道自己到底写的好与不好的时候,该怎么办?以前我的做法是,到 GitHub 上去看看别人写的,或者是别人用的方法,然后结果还是没有找到我想要得到的。因为别人可能做的事情和你的大体类似,但是需求可能不一样,而想要知道代码的好与坏跟他们的实现其实关系不大,你要做的是让你的代码舒服,或者是没有坏的味道,那么首先你要知道哪些是坏味道?这本书中的每种技巧都是针对了每一种坏的味道,慢慢体会领悟,然后写几行代码看看,自然就知道是怎么回事,这样你就可以对着这本书的重构列表慢慢的看你自己写的类,写的方法,写的字段,就知道哪里哪里该怎么进行优化了,不要觉得这些小技巧没什么,他们综合起来就可以让代码质量上升为一个等级。

1…456…13
Alice

Alice

The Loneliest Whale in the World

121 日志
35 分类
30 标签
© 2021 Alice
由 Hexo 强力驱动
主题 - NexT.Pisces