黑马程序员技术交流社区

标题: 做一个Objective-C作业引发的思考 [打印本页]

作者: Harvey_ios    时间: 2015-5-9 13:53
标题: 做一个Objective-C作业引发的思考
/*
需求:设计一个类Point2D,用来表示二维平面中某个点
1> 属性
* double x
* double y
2> 方法
* 属性相应的set和get方法
* 设计一个对象方法同时设置x和y
* 设计一个对象方法计算跟其他点的距离
* 设计一个类方法计算两个点之间的距离
3> 提示
* C语言的math.h中有个函数:double pow(double n,double m); 计算n的m次方
* C语言的math.h中有个函数:double sqrt(double n); 计算根号n的值(对n进行开根)
*/
/*
一、下面是我的代码:
#import <Foundation/Foundation.h>
#import <math.h>
@interface Point2D : NSObject
// 点
{
    double _x; // x的值
    double _y; // y的值
}
// x的get和set方法
- (void)setX : (double)x;
- (double)x;
// y的get和set方法
- (void)setY : (double)y;
- (double)y;
// 同时设置x和y的值
- (void)setX : (double)x andY : (double)y;
// 计算和其他点得距离
- (double)distanceWithOtherPoint : (Point2D *)p;
// 计算点和点之间的距离
+ (double)distanceBetweenPoint1 : (Point2D *)p1 andPoint2 : (Point2D *)p2;
@end // Point2D声明
// 方法
@implementation Point2D
- (void)setX : (double)x
{
    _x = x;
}
- (double)x
{
    return _x;
}
- (void)setY : (double)y
{
    _y = y;
}
- (double)y
{
    return _y;
}
- (void)setX : (double)x andY : (double)y
{
    _x = x;
    _y = y;
   
     // [self setX:x]; //设置x过程中可能涉及到过滤的问题,如果x的值不符合要求,我们需要处理
    // [self setY:y];
     
}
- (double)distanceWithOtherPoint : (Point2D *)p
{   
    double x1 = [p x];
    double y1 = [p y];
    return  sqrt(pow(_x-x1, 2) + pow(_y-y1, 2));
}
+ (double)distanceBetweenPoint1 : (Point2D *)p1 andPoint2 : (Point2D *)p2
{
    double x1 = [p1 x];
    double y1 = [p1 y];
    double x2 = [p2 x];
    double y2 = [p2 x];
    return sqrt(pow(x1-x2, 2) + pow(y1-y2, 2));
}
@end //Point2D
//主函数
int main()
{
    Point2D *pt1 = [Point2D new];
    Point2D *pt2 = [Point2D new];
    Point2D *pt3 = [Point2D new];
    //[pt1 setX : 2 andY : 2];
    [pt2 setX : 4 andY : 4];   
    [pt3 setX : 9 andY : 9];
    double distance1 = [pt1distanceWithOtherPoint : pt2];
    double distance2 = [Point2DdistanceBetweenPoint1 : pt2 andPoint2 : pt3];
    NSLog(@"The distande with other point is %f",distance1);
    NSLog(@"The distande between point1 and point2 is %f",distance2);
   
    return 0;
   
}
二、引发的思考
第一、如何写好注
我对注释一直都不是很重视,读大学写代码也很少写注释,也不知道怎么写,什么时候该写,什么时候不该写,没什么概念,通过这个作业题正好可以练习如何写好注释,写注释主要就是为了可读性,多看优秀代码,看老师是如何注释的,养成写注释习惯。
第二、避免重复代
//  计算和其他点得距离 我的方法一
- (double)distanceWithOtherPoint : (Point2D *)p
{   
    double x1 = [p x];
    double y1 = [p y];
    return  sqrt(pow(_x-x1, 2) + pow(_y-y1,2));
}
//  方法二,因为后面有一个求两点之间距离的方法,两者有相似之处,需要避免重复代码
- (double)distanceWithOther:(Point2D *)other
{
    // 不要再傻乎乎算一遍了,直接调用类方法即可
    return [Point2DdistanceBetweenPoint1:self andPoint2:other];
}
找代码之间的共同点,写好一个方法,其他方法可以间接调用
第三、并不是代越精越好,有的时候为了可读性,代码需要写的详细一点
//  求两点之间距离  ,我的 方法一
+ (double)distanceBetweenPoint1 : (Point2D *)p1 andPoint2 : (Point2D *)p2
{
    double x1 = [p1 x];
    double y1 = [p1 y];
    double x2 = [p2 x];
    double y2 = [p2 x];
    returnsqrt(pow(x1-x2, 2) + pow(y1-y2, 2));  // 一行代码解决,但可读性不强
//
}
//   第二种方法  分步骤,思路清晰
+ (double)distanceBetweenPoint1:(Point2D *)p1 andPoint2:(Point2D *)p2
{
    // 两点距离公式:( (x1-x2)的平方 + (y1-y2)的平方 )开根
    // x1-x2
    double xDelta = [p1 x] - [p2x];
    // (x1-x2)的平方
    double xDeltaPingFang =pow(xDelta, 2);
    // y1-y2
    double yDelta = [p1 y] - [p2y];
    // (y1-y2)的平方
    double yDeltaPingFang =pow(yDelta, 2);
    return sqrt(xDeltaPingFang + yDeltaPingFang);
}
第四、经验问题
// 同时设置x的值和y的值 ,方法一
- (void)setX : (double)x andY : (double)y
{
    _x = x;
    _y = y;
}  // 这里没考虑到设置x过程中可能涉及到过滤的问题,如果x的值不符合要求,我们需要处理

// 方法二
- (void)setX : (double)x andY : (double)y
{
    [self setX:x];  // 这里调用set方法设置x和y的值,考虑了x过滤问题
    [self setY:y];
}
这是我做这道练习题的一些思考,欢迎批评指正!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2