/* 需求:设计一个类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]; } 这是我做这道练习题的一些思考,欢迎批评指正! |