昨天的微信是晚10点左右发送的,写了盗版和付费的问题,结果到凌晨也没发出去,不知道为什么,可能是微信审核人员休假去袅,按理说这个内容不该犯禁啊(当然,你永远不知道自己是否踩线,因为没人告诉你线在哪里,理在哪里)。基于这种微信抽风和个人写作时间不定的情况,我新增加了一条规则,晚上11点之后如果大家还没有收到Mac技巧,回复 t,可以收到当天的微信。如果发现还是昨天的那条,要么是我忘改了,要么是确实没写。
(看昨天的“Mac上的软件付费”,回复103,看当天的,回复 t)
今天聊聊软件的复用和抄袭,本来想用复用和复制做标题,觉得有标题党之嫌,而且意思也不明确,遂改为复用和抄袭。
文字上的抄袭相对容易辨识,你复制了别人的文字说是自己写的,在现在这个互联网时代已经很容易被发现了。我所关注的几位微信平台的作者基本都是原创,即使有引用也标注的清清楚楚,这一点技术人还是毫不含糊的,而持续的原创也是吸引读者的重要原因之一,否则你也很难拥有成千上万的读者。
但是在软件层面,复用和抄袭就不是那么容易分辨了。比如复用被骂抄袭的,抄袭了说自己是复用的等等。这个主题其实挺大,我简单说说。
软件复用是一个久远而不过时的主题,其主要目的就是复用已有的软件技术(收费的或免费的),建立新的软件系统,提高生产力和质量。复用是软件开发领域一直倡导的,从早期的代码复用、算法复用,到现在的组件复用、框架复用、服务复用、计算复用、资源复用等等,我个人近些年也一直在做这方面的工作,复用的宗旨就是让程序员写最有价值的代码,而不是写重复的代码!
与复用相对的是NIH综合症,NIH(Not Invented Here)的意思是“非我所创”。得了这个病的人,症状是所有的东西都要自己写,永远不使用现成的代码、库、框架、服务,因为那些是别人写的。他们的口头禅是我可以写的更好。且不论能不能更好,单是推倒别人的系统重写一遍这件事,就只是模仿而不是创造,大部分时候都是无用功,徒增代码和浪费时间。无论大小,每个组织几乎都有NIH患者,得了这个病怎么办?一得治,二药不能停。
真相就是:无论你从事什么领域的工作,无论你有多么优秀,聪明伶俐精力旺盛锐意进取,但是漫漫人生路,时间和精力都是有限的,合理利用世界上其他人的劳动成果,方可成就自己的事业。
那什么是抄袭呢,我觉得可以从产品和技术两个方面去看。
从产品层面,看到一款具备优秀创意和功能的软件产品,你研究一下,然后做了一个一模一样的复制品,改改名称和语言,就说是自己的创意和产品,这毫无疑问是抄袭,就像大家说当年的微信1.0抄袭Talkbox一样,有阵子业界还为此类抄袭起了个洋名叫微创新。但是如果你看到了这款产品,经过研究,激发了你新的创意,你在这个产品的基础上做出了一个全新的东西,那就不再是抄袭了,就像没人说现在的微信抄袭Talkbox一样,因为大家都忙着学习微信的创新呢。
技术层面相对简单一些,使用商用和免费的技术和组件做自己的软件,都是复用;把别人的技术拿过来说成是自己的成果,都是抄袭。
有优秀的框架和组件不去复用自己写的,是愚蠢;把别人的东西拿来改改说成是自己的,是无耻。
今日Mac技巧:
上次讲OC那篇收到诸多好评,今天接着聊吧。
Objective-C与Java一样,不支持多重继承,但是通过分类(Category)和协议(Protocol)可以很好的实现代码复用和扩展。这期技术内容聊聊Objective-C的Category(分类)。
Objective-C提供了一种与众不同的方式——Category,可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要访问其源代码,也不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
实现起来很简单,我们举例说明。
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end
这是类SomeClass的声明文件,其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下,为该类增加一个hello的方法,只需要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m,在声明文件和实现文件中用“()”把Category的名称括起来即可。声明文件代码如下:
#import "SomeClass.h"
@interface SomeClass (Hello)
-(void)hello;
@end
实现文件代码如下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
NSLog (@"name:%@ ", @"Jacky");
}
@end
其中Hello是Category的名称,如果你用XCode创建Category,那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯,将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
调用也非常简单,如下:
首先引入Category的声明文件,然后正常调用即可。
#import "SomeClass+Hello.h"
SomeClass * sc =[[SomeClass alloc] init];
[sc hello]
执行结果是:
name:Jacky