java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

製品と原料クラスを考え、価格を扱うことを考えてみた

投稿日:

最終更新日:2022年12月18日

アイキャッチ

こんにちは。今回は製品クラスと原料クラスを作って、価格を扱うことを考えました。

目的としては、製品の価格が原料の価格の合計と比較して、利益があるかどうかを判定することです。

今回の考え方としては、原料クラスは価格を持ち、製品クラスは製品の価格、原料のリストを持つという考え方です。また、価格の判定は製品クラスを扱うクラスに任せるという想定です。

製品と原料のクラス概要
製品の価格と原料の価格

上図のように、製品は価格と原料のリストを持つとします。比較したいのは、製品の価格、原料の価格の合計です。

今回のクラスの作り方では、以下の方針でクラスを作りました。

  • 原料クラスは価格を持つ。
  • 製品クラスは(製品の)価格と、原料のリストを持つ。原料の価格の合計を返却する。

この記事の前半では原料クラスについてサンプルを記載しました。後半では製品クラスのサンプルを記載しました。製品クラスの動作テストでは製品の価格と、その製品の原料の価格の合計の比較処理をしました。

原料クラス

最初に考えたのは原料クラスです。このクラスは価格だけをフィールドに持つという作りにしました。

原料クラス

/**
 * 原料
 */
public class Material {
	/**
	 * 価格
	 */
	private int price;

	public Material(int price) {
		this.price = price;
	}

	public int getPrice() {
		return price;
	}

	@Override
	public String toString() {
		return Integer.toString(price);
	}

}

変数priceは価格を格納するための変数です。コンストラクタで価格を受け取り、このフィールドで値を保持します。

原料の価格を取得するためのメソッドとして、getPrice()メソッドを作っています。

toString()は原料の価格を出力するだけ返却するようにしました。

以下、このクラスのテストです。

原料クラスのテスト

public class MaterialTest {

	public static void main(String[] args) {
		MaterialTest test = new MaterialTest();
		test.exe();
	}

	private void exe() {
		Material material = new Material(100);
		System.out.println(material);

		material = new Material(200);
		System.out.println(material);

	}

}

結果

100
200

上記のexe()では原料クラスのインスタンスを生成し、変数materialに格納しています。最初のコンストラクタの呼出しでは引数を100にしています。

println()メソッドではmaterialを引数にしています。MaterialクラスのtoString()が呼び出されます。そのため、原料クラスの価格が出力されます。

製品クラス

製品クラスはフィールドに「価格」と「製品のリスト」を持つという考えで作りました。

ソース

import java.util.Arrays;
import java.util.List;

/**
 * 製品
 */
public class Product {
	/**
	 * 値段
	 */
	private int price;

	/**
	 * 原料のリスト
	 */
	private List<Material> materials;

	public Product(int price, List<Material> materials) {
		this.price = price;
		this.materials = materials;
	}

	/**
	 * @return 原料の価格の合計
	 */
	public int cost() {
		int total = 0;

		for (Material material : materials) {
			total += material.getPrice();
		}

		return total;
	}

	public int getPrice() {
		return price;
	}

	@Override
	public String toString() {
		StringBuffer buffer = new StringBuffer();

		buffer
			.append("製品の値段:")
			.append(price)
			.append("\n")
			.append("原料の値段の合計:")
			.append(cost())
			.append("\n")
			.append("内訳:")
			.append(Arrays.toString(materials.toArray()));

		return buffer.toString();
	}
}

フィールドのpriceは製品の価格を保持するための変数です。

フィールドのmaterialsは原料を複数持つためのリストです。

上記二つのフィールドはコンストラクタの引数で受け取ったものをそのまま格納する想定です。

cost()メソッドはmaterialsに格納された原料の価格の合計を返却するメソッドです。製品クラスを扱う処理でこのメソッドを呼び出し、製品の価格と比較する想定です。

以下は製品クラスのテストです。

ソース

import java.util.ArrayList;
import java.util.List;

public class ProductTest {

	public static void main(String[] args) {
		ProductTest test = new ProductTest();
		test.exe();
	}

	private void exe() {
		List<Material> materials = new ArrayList<>();
		materials.add(new Material(100));
		materials.add(new Material(101));
		materials.add(new Material(210));

		Product product = new Product(1000, materials);
		printJudgement(product);

		materials = new ArrayList<>();
		materials.add(new Material(900));
		materials.add(new Material(100));

		product = new Product(1000, materials);
		printJudgement(product);

	}

	private void printJudgement(Product product) {
		System.out.println(product);

		System.out.print("結果・・・");

		if (product.getPrice() > product.cost()) {
			System.out.println("利益有");
		} else {
			System.out.println("利益無");
		}
		System.out.println("------------------------");
	}

}

printJudgement()メソッドは引数で受け取った製品クラスに対して、製品の価格と原料の価格の合計を比較しています。利益があるかどうかを出力しています。

結果

製品の値段:1000
原料の値段の合計:411
内訳:[100, 101, 210]
結果・・・利益有
------------------------
製品の値段:1000
原料の値段の合計:1000
内訳:[900, 100]
結果・・・利益無
------------------------

上記のように、製品の価格の方が原料の価格の合計より大きい場合、「利益有」と出力されました。

今回、価格の比較は製品クラス・原料クラスには含みませんでした。なので、この2つのクラスは自身のデータを扱うだけのクラスという役割だけです。このように、データだけのクラスを作り、別のクラスで比較処理などを実装すると全体の見通しが良くなると思います。

以上、参考になれば幸いです。