3.1-互评-OO设计-有理数类的设计

仿照BigDecimal类以面向对象的方式设计有理数类。

1.给出你的有理数类的代码。

package classdesign;

import java.math.BigInteger;

public class RationalNumber {
	private double rNum;
	private Integer molecule;
	private Integer denominator;

	public double getrNum() {
		return rNum;
	}

	public void setrNum(double rNum) {
		this.rNum = rNum;
	}
	
	public int getMolecule() {
		return molecule;
	}

	public void setMolecule(int molecule) {
		this.molecule = molecule;
	}

	public int getDenominator() {
		return denominator;
	}

	public void setDenominator(int denominator) {
		this.denominator = denominator;
	}

	public RationalNumber(double newRNum) {
		rNum = newRNum;
	}
	
	public RationalNumber(int molecule, int denominator) {
		this.molecule = molecule;
		this.denominator = denominator;
		rNum = molecule*1.0/denominator;
	}
	
	public double add(double item) {
		return rNum+item;
	}
	
	public double subtraction(double item) {
		return rNum-item;
	}
	
	public double multiply(double item) {
		return rNum*item;
	}
	
	public double division(double item) {
		if(item == 0.0) {
			System.out.println("error:除0错误");
			return 0.0;
		}
		return rNum/item;
	}
	
	public void simplifyFraction() {
		BigInteger bi1 = new BigInteger(molecule.toString());
		BigInteger bi2 = new BigInteger(denominator.toString());
		int gcd = bi1.gcd(bi2).intValue();
		
		molecule = molecule/gcd;
		denominator = denominator/gcd;
	}

}

2.给出你的测试代码。要在与有理数类不同包的其他类中调用有理数类。

package test;

import classdesign.RationalNumber;

public class Test {

	public static void main(String[] args) {
		RationalNumber rNum1 = new RationalNumber(4.8);
		RationalNumber rNum2 = new RationalNumber(2.4);
		RationalNumber rNum3 = new RationalNumber(2, 4);
		
		System.out.println("测试加法");
		System.out.println("4.8 + 2.4 = "+rNum1.add(rNum2.getrNum()));
		System.out.println("测试减法");
		System.out.println("4.8 - 2.4 = "+rNum1.subtraction(rNum2.getrNum()));
		System.out.println("测试乘法");
		System.out.println("4.8 * 2.4 = "+rNum1.multiply(rNum2.getrNum()));
		System.out.println("测试除法");
		System.out.println("4.8 / 2.4 = "+rNum1.division(rNum2.getrNum()));
		System.out.println("4.8 / 0.0 = "+rNum1.division(0.0));
		System.out.println("分数2/4化简之后的分数形式以及小数形式");
		rNum3.simplifyFraction();
		System.out.println("2/4 = "+rNum3.getMolecule()+"/"+rNum3.getDenominator()+" ; "+"2/4 = "+rNum3.getrNum());
		

	}

}

测试结果如下:

3.尝试描述怎么与c语言的有理数代码相比较,为什么你设计的类更加面向对象?
C语言是面向过程的语言,主要是先编写好所需要的函数,然后考虑如何调用已经写好的函数;而此次设计的有理数类是先设计一个模板,其中有属性、方法,通过这个模板可以生成许多对象,每个对象代表了一个有理数实体,并能够通过自身的方法来进行操作。

4.尝试从代码复用的角度来描述你设计的有理数类。从几个方面讨论。

  • a. 别人如何复用你的代码?
    可以将编写好的有理数类包下载到个人的电脑,然后通过import语句导入有理数类,从而复用代码。
  • b. 别人的代码是否依赖你的有理数类的属性?当你的有理数类的属性修改时,是否会影响他人调用你有理数类的代码?
    是要依赖我的有理数类的属性,当这些属性修改时,也会影响他人调用我的代码。为了实现某些功能,从而引入了
private double rNum;
private Integer molecule;
private Integer denominator;

这三个属性,当这些属性被删除或者是改动时,之前的代码就无法使用了。

  • c. 有理数类的public方法是否设置合适?为什么有的方法设置为private?
    public方法可以供调用者使用,不需要调用者关心的其他方法就需要封装起来。一般来说,方法用private加以修饰的情况有:
    • 该方法仅供内部访问
    • 增加安全性,限制用户仅能通过给定的方法对数据进行操作
posted @ 2020-10-04 11:34  朱振豪  阅读(147)  评论(0编辑  收藏  举报