3.1-OO设计-有理数的设计
3.1-OO设计-有理数的设计
博客内容:仿照BigDecimal类以面向对象的方式设计有理数类。
1.给出你的有理数类的代码。
我的有理数类代码:
package javaRationalNumber;
public class RationalNumber {
private double rationNumber;
public double getRationNumber() {
return rationNumber;
}
public void setRationNumber(double rationNumber) {
this.rationNumber = rationNumber;
}
public void add(Double addNum) {
rationNumber = rationNumber + addNum;
System.out.println(toStr());
}//加运算
public void sub(Double subNum) {
rationNumber = rationNumber - subNum;
System.out.println(toStr());
}//减运算
public void mul(Double mulNum) {
rationNumber = rationNumber * mulNum;
System.out.println(toStr());
}//乘运算
public void div(Double divNum) {
rationNumber = rationNumber / divNum;
System.out.println(toStr());
}//除运算
public void rem(Double remNum) {
rationNumber = rationNumber%remNum;
System.out.println(toStr());
}//求余运算
public void sqrt() {
System.out.println(Math.sqrt(rationNumber));
}//有理数的开方
public void pow(int n) {
double num = rationNumber;
for(int i=0;i < n;i++) {
rationNumber *= num;
}
System.out.println(toStr());
}//有理数的n次方
public void com(Double comNum) {
if(rationNumber > comNum)
System.out.println(rationNumber+" > "+comNum);
else if(rationNumber < comNum)
System.out.println(rationNumber+" < "+comNum);
else
System.out.println(rationNumber+" = "+comNum);
}//作比较
public void round(int dec) {
System.out.println(String.format("%."+dec+"f", rationNumber));
}//小数的四舍五入
private String toStr() {
String str = ""+rationNumber;
return str;
}//Double转String类型
private int toInt() {
int num = (int) rationNumber;
return num;
}//Double转Int类型
private float toFloat() {
float num = (float) rationNumber;
return num;
}//Double转float类型
}
2.给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。
测试代码:
package javaRationalNumber;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double number = scanner.nextDouble();
double nextNumber = scanner.nextDouble();
RationalNumber firstNumber = new RationalNumber();
firstNumber.setRationNumber(number);
System.out.println("输入的数是:"+firstNumber.getRationNumber());//测试输入的值是否正确
firstNumber.add(nextNumber); //计算number+nextNumber
firstNumber.sub(nextNumber); //计算number-nextNumber
firstNumber.mul(nextNumber); //计算number*nextNumber
firstNumber.div(nextNumber); //计算number/nextNumber
firstNumber.rem(nextNumber); //计算number%nextNumber
firstNumber.sqrt(); //计算number的开方结果
firstNumber.pow((int)nextNumber); //计算number的nextNumber次方的结果
firstNumber.com(nextNumber); //将number与nextNumber作比较
firstNumber.round((int)nextNumber); //将number四舍五入为小数点后nextNumber位小数
scanner.close(); //关闭对象scanner
}
}
测试结果:
1)number + nextNumber
2)number - nextNumber
3)number * nextNumber
4)number / nextNumber
5)计算number % nextNumber
6)计算number的开方结果 (这里因为只需要输入number一个参数,所以后面输入的0没有实际作用)
7)计算number 的 nextNumber 次方的结果(number^nextNumber)
8)将number与nextNumber作比较
9)将number四舍五入为小数点后nextNumber位小数
3.类名、变量名命名需符合Java规范。
该代码普遍使驼峰命名法命名。
4.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言完全面向过程,而我的代码具有例如封装、继承这些Java的核心特征,是面向对象的经典特征,且可重用性高,可扩展性强,所以会区别于C语言的有理数代码,会更倾向于面向对象。
5.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。
-
别人如何复用你的代码?
此代码的服用方法为组合,他人可以在新类中创建RationalNumber类的对象,通过该对象来调用已有类中的非private的属性和方法。
-
别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
他人的代码会依赖有理数类的属性,当我对有理数的属性修改时,也会影响到他人调用有理数类的代码。
-
有理数类的public方法是否设置合适?为什么有的方法设置为private?
需要根据需要来进行方法的访问级别。有一些方法需要设置为private,这样的话,这一方法就只能在这一类中使用,对于别的类来说相当于是隐藏不可见的,可以保护该方法中的赋值不被外界干扰,保护了子类。