其是学过语言的都基本知道面向对象的概念OOP(Object-Oriented Programming),由于自己学习编程时间不长,理解不是很透澈,只是照本宣科,自己理解为主。
关键词: Indirection 理解就是接口
首先我们先来看2段代码
NSLog(@"The Number from 1 to 5:");
for (int i=1; i<=5; i++) {
NSLog(@"%d\n",i);
}
int count=5;
NSLog(@" The Numbers from 1 to %d:",count);
for (int i =1; i<=count; i++) {
NSLog(@"%d\n",i);
}
同样都是显示数字1-5基本都没有区别。
但是当我去修改要显示1-10时,第一个需要修改两处,而第二处只需要修改一处。这只是一个简单例子。这样就会使代码更容易扩展。
现在我们再看2段代码
const char *word[4]={"Joe-Bob ß®\"Handyman\" Brown","Jacksonville\"Sly\" Murphy","Sgubara Bain","George \"Guitar\" Books"};
int wordCount=4;
for (int i=1; i<wordCount; i++) {
NSLog(@"%s is %d characters long",word[i],strlen(word[i]));
}
这里在NSLog(@"%s is %d characters long",word[i],strlen(word[i]));会有一个警告但是没关系。const是常量。
FILE *wordFile=fopen("/tmp/words.txt", "r");
char word[100];
while (fgets(word,100,wordFile)) {
word[strlen(word)-1]='\0';
NSLog(@"%s is %d characters long",word,strlen(word));
}
fclose(wordFile);
不过暂时还没测试通过因为对mac系统不熟悉,不知道如何去添加/tmp/words.txt文件。
没有找到Xcode左边项目下面的Executables有可能是环境不同。
过程是编程
先绘制几何图形
typedef enum
{
KCircle,
KRectangle,
KOblateSpheroid
}ShapeType;
typedef enum
{
kRedColor,
kGreenColor,
kBlueColor
}ShapeColor;
//结构
typedef struct
{
int x,y,width,height;
}ShapeRect;
typedef struct
{
ShapeType type;
ShapeColor color;
ShapeRect rect;
}Shape;
NSString *colorName(ShapeColor colorname)
{
switch (colorname) {
case kRedColor:
return @"red";
break;
case kGreenColor:
return @"green";
case kBlueColor:
return @"blue";
default:
return @"no color";
break;
}
}
void drawCircle(ShapeRect rect,ShapeColor color)
{
NSLog(@" drawing a circle at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}
void drawRectangle(ShapeRect rect,ShapeColor color)
{
NSLog(@" drawing a rectangle at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}
void drawOblatespheroid(ShapeRect rect,ShapeColor color)
{
NSLog(@" drawing a oblatespheroid at(%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}
void drawShapes(Shape shapes[],int count)
{
for (int i =0; i<count; i++) {
switch (shapes[i].type) {
case KCircle:
drawCircle(shapes[i].rect,shapes[i].color);
break;
case KRectangle:
drawRectangle(shapes[i].rect,shapes[i].color);
break;
case KOblateSpheroid:
drawOblatespheroid(shapes[i].rect,shapes[i].color);
break;
}
}
}
int main (int argc, const char * argv[])
{
Shape shapes[3];
ShapeRect rect0 ={0,0,20,50};
shapes[0].type=KCircle;
shapes[0].color=kRedColor;
shapes[0].rect=rect0;
ShapeRect rect1 ={30,40,50,60};
shapes[1].type=KRectangle;
shapes[1].color=kGreenColor;
shapes[1].rect=rect1;
ShapeRect rect2={15,18,37,29};
shapes[2].type=KOblateSpheroid;
shapes[2].color=kBlueColor;
shapes[2].rect=rect2;
drawShapes(shapes,3);
return 0;
}
可以看到有很多地方是重复的,这就会导致占用资源。
//圆接口----------------------------------------------------
@interface Circle : NSObject {
ShapeColor color;
ShapeRect rect;
}
-(void) setColor:(ShapeColor) color;//前面有-表示的时方法声明, 没有的则是函数原型
//-(返回类型) 方法名:(参数类型) 参数名
-(void) setRect:(ShapeRect) rect;
-(void) draw;//如果方法没有参数则不使用冒号,反之,有参数则用冒号
@end//Circle
//实现圆的功能------------------------------------------------
@implementation Circle
-(void)setColor:(ShapeColor)c
{
color=c;
}
-(void) setRect:(ShapeRect)r
{
rect=r;
}
-(void) draw
{
NSLog(@"drawing a circle at (%d %d %d %d) in %@",rect.x,rect.y,rect.width,rect.height,colorName(color));
}
@end
修改一部分用接口来实现。但是任然发现他们还是有很多共同之处。如果增加新的会出现大量重复代码。
1.object-c是严格区分大小写的。
2完整的句末要加上分号。
3.声明一个变量 int i=4;char *words 这是声明一个指针变量。如果学过c++这个就很熟练了。
4.用到File 中的fopen()用于打开文件,fgets(word)从文件中读取一行文本并将其放入word中,fclose()关闭文件。
5.object-c编程风格建议使用首字母大写的类名。
6.声明枚举,结构,typeof enum/struct {}名称。
7.开放/封闭原则(Open/Closed Principle)即软件实体应该对扩展开放,对修改关闭。