ざっくりオブジェクト指向プログラミング解説:サンプルコード#4実践編②
こちらは別サイトの動画の『ざっくりオブジェクト指向プログラミング解説』で使用したサンプルコードを公開する記事になっています。
動画をご覧になっていない方には、ほぼ意味不明の記事ですのでその点ご了承ください。
※第4章は、3店舗追加バージョンのみです。
3.1 Main ー第4章ソースコードー
各オブジェクトを生成して、コントローラーに処理を渡す。
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import receipt.nooop.ReceiptControllerVer3;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class Main {
public static void main(String[] args) {
BasicInformation basicInformation = getBasicInformation();
BasicInformation basicInformation2 = getBasicInformationYukari();
BasicInformation basicInformation3 = getBasicInformationMaki();
List<PurchasedGoods> goodsList = getGoodsList();
List<PurchasedGoods> goodsList2 = getGoodsListYukari();
List<PurchasedGoods> goodsList3 = getGoodsListMaki();
ReceiptControllerVer3 receiptController = new ReceiptControllerVer3();
receiptController.execute(basicInformation,goodsList);
System.out.println();
receiptController.execute(basicInformation2,goodsList2);
System.out.println();
receiptController.execute(basicInformation3,goodsList3);
}
//テスト用のBasicInformationを生成する
private static BasicInformation getBasicInformation(){
Calendar c = Calendar.getInstance();
c.set(2019,1,10,12,34,50);
return new BasicInformation(ReceiptControllerVer3.STORE_NM_ITAKO,"恐山支店",c.getTime(),"2000","999-3456-0000","");
}
//テスト用のBasicInformationを生成する
private static BasicInformation getBasicInformationYukari(){
Calendar c = Calendar.getInstance();
c.set(2019,1,10,12,34,50);
return new BasicInformation(ReceiptControllerVer3.STORE_NM_YUKARI,null,c.getTime(),"5000","012-3456-0000","");
}
//テスト用のBasicInformationを生成する
private static BasicInformation getBasicInformationMaki(){
Calendar c = Calendar.getInstance();
c.set(2019,1,10,12,34,50);
return new BasicInformation(ReceiptControllerVer3.STORE_NM_MAKI,"東京支店",c.getTime(),"2000","03-0000-0000","東京都千代田区××0丁目");
}
//テスト用のPurchasedGoodsリストを生成する
private static List<PurchasedGoods> getGoodsList(){
ArrayList<PurchasedGoods> goodsList = new ArrayList<PurchasedGoods>();
goodsList.add(new PurchasedGoods("あじの盛り塩焼き","500"));
goodsList.add(new PurchasedGoods("水の子サラダ","250"));
goodsList.add(new PurchasedGoods("お神酒","300"));
return goodsList;
}
//テスト用のPurchasedGoodsリストを生成する
private static List<PurchasedGoods> getGoodsListYukari(){
ArrayList<PurchasedGoods> goodsList = new ArrayList<PurchasedGoods>();
goodsList.add(new PurchasedGoods("猿でもわかる手続き型","1500"));
goodsList.add(new PurchasedGoods("猫でもわかるOOP","1250"));
goodsList.add(new PurchasedGoods("犬でもわかる関数型","1300"));
return goodsList;
}
//テスト用のPurchasedGoodsリストを生成する
private static List<PurchasedGoods> getGoodsListMaki(){
ArrayList<PurchasedGoods> goodsList = new ArrayList<PurchasedGoods>();
goodsList.add(new PurchasedGoods("パン","200"));
goodsList.add(new PurchasedGoods("ミネラルウォーター","250"));
goodsList.add(new PurchasedGoods("とりにく","300"));
goodsList.add(new PurchasedGoods("いちご","400"));
return goodsList;
}
}
3.2 ReceiptControllerVer3 ー第4章ソースコードー
3店舗対応バージョン
package receipt.nooop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
public class ReceiptControllerVer3 {
public static final String STORE_NM_ITAKO = "イタコ食堂";
public static final String STORE_NM_YUKARI = "ゆかり書房";
public static final String STORE_NM_MAKI = "マキマキマーケット";
public final static String HR = "===============================";
public final static String HR2 = " ----------------------------- ";
public void execute(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
//header
createHeader(basicInformation);
//contents
createContents(basicInformation, purchasedGoodsList);
//footer
createFooter(basicInformation);
}
private void createHeader(BasicInformation basicInformation){
System.out.println();
System.out.println(lineFormatCenter(basicInformation.getStoreName()));
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO) ||
basicInformation.getStoreName().equals(STORE_NM_MAKI)){
System.out.println(basicInformation.getBranchName());
}
if(basicInformation.getStoreName().equals(STORE_NM_MAKI)){
System.out.println(" " + basicInformation.getAddress());
System.out.println(" " + basicInformation.getPhoneNumber());
SimpleDateFormat sdf = new SimpleDateFormat(" yyyy/MM/dd hh:mm:ss");
System.out.println(sdf.format(basicInformation.getPurchaseTime()));
}else{
System.out.println();
}
System.out.println(HR);
}
private void createContents(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
String printStr = null;
BigDecimal sum = new BigDecimal("0");
for(PurchasedGoods goods : purchasedGoodsList){
sum = sum.add(goods.getPrice());
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO)) {
printStr = lineFormatGoodsRow(goods.getGoodsName(), goods.getPrice());
}else if(basicInformation.getStoreName().equals(STORE_NM_YUKARI)) {
printStr = lineFormatGoodsRowYenSign(goods.getGoodsName(), goods.getPrice());
}else {
printStr = lineFormatGoodsRowNoSign(goods.getGoodsName(), goods.getPrice());
}
System.out.println(printStr);
}
System.out.println(HR2);
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO)) {
printStr = lineFormatGoodsRow("合計", sum);
}else {
printStr = lineFormatGoodsRowYenSign("合計", sum);
}
System.out.println(printStr);
System.out.println(HR2);
basicInformation.getPaymentAmount().intValue();
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO)) {
printStr = lineFormatGoodsRow("お預り", basicInformation.getPaymentAmount());
}else {
printStr = lineFormatGoodsRowYenSign("お預り", basicInformation.getPaymentAmount());
}
System.out.println(printStr);
BigDecimal change = basicInformation.getPaymentAmount().subtract(sum);
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO)) {
printStr = lineFormatGoodsRow("お釣り", change);
}else{
printStr = lineFormatGoodsRowYenSign("お釣り", change);
}
System.out.println(printStr);
}
private void createFooter(BasicInformation basicInformation){
if(basicInformation.getStoreName().equals(STORE_NM_ITAKO) ||
basicInformation.getStoreName().equals(STORE_NM_YUKARI) ){
System.out.println(HR);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
System.out.println(sdf.format(basicInformation.getPurchaseTime()));
}
}
private String lineFormatGoodsRow(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPirceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s %" + gPirceLen + "d円 ",gName,gPrice.intValue());
}
private String lineFormatGoodsRowYenSign(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s \\%," + gPriceLen + "d ",gName,gPrice.intValue());
}
private String lineFormatGoodsRowNoSign(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s %," + gPriceLen + "d ",gName,gPrice.intValue());
}
private String lineFormatCenter(String orgStr){
final int strLen = 31;
int diffStrLen = 0;
for(char c : orgStr.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
int preSpCnt = (strLen - orgStr.length() - diffStrLen) / 2;
//String displayStr = IntStream.range(0, preSpCnt).mapToObj(i -> " ").collect(Collectors.joining("", "", orgStr));
StringBuffer displayStr = new StringBuffer();
for(int i = 0 ; i < preSpCnt; i++) {
displayStr.append(" ");
}
displayStr.append(orgStr);
return String.format("%-"+ (strLen - diffStrLen) +"s",displayStr);
}
}
3.3 BasicInformation ー第4章ソースコードー
一部項目追加。
package Basket;
import java.math.BigDecimal;
import java.util.Date;
public class BasicInformation {
private String storeName = null;
private String branchName = null;
private Date purchaseTime = null;
private BigDecimal paymentAmount = null;
//追加
private String phoneNumber = null;
private String address = null;
public BasicInformation(String storeName, String branchName, Date purchaseTime, String paymentAmount,String phoneNumber,String address){
setStoreName(storeName);
setBranchName(branchName);
setPurchaseTime(purchaseTime);
setPaymentAmount(paymentAmount);
setPhoneNumber(phoneNumber);
setAddress(address);
}
public String getStoreName() {
return storeName;
}
public void setStoreName(String storeName) {
this.storeName = storeName;
}
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public Date getPurchaseTime() {
return purchaseTime;
}
public void setPurchaseTime(Date purchaseTime) {
this.purchaseTime = purchaseTime;
}
public BigDecimal getPaymentAmount() {
return paymentAmount;
}
public void setPaymentAmount(BigDecimal paymentAmount) {
this.paymentAmount = paymentAmount;
}
public void setPaymentAmount(String paymentAmount) {
this.paymentAmount = new BigDecimal(paymentAmount);
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3.4 PurchasedGoods ー第4章ソースコードー
前章から特に変更無し。
package Basket;
import java.math.BigDecimal;
public class PurchasedGoods {
private String goodsName = null;
private BigDecimal price = null;
public PurchasedGoods(String goodsName, String price){
this.goodsName = goodsName;
this.price = new BigDecimal(price);
}
public String getGoodsName() {
return goodsName;
}
public BigDecimal getPrice() {
return price;
}
}
4.1 Main ー第5章ソースコードー
前章から変更無いため省略。
4.2 ReceiptController ー第5章ソースコードー
ポリモーフィズム対応版。
package receipt.oop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.util.List;
public class ReceiptController {
public static final String STORE_NM_ITAKO = "イタコ食堂";
public static final String STORE_NM_YUKARI = "ゆかり書房";
public static final String STORE_NM_MAKI = "マキマキマーケット";
public void execute(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
try {
IReceiptCreator creator = getReceiptCreator(basicInformation);
//header
creator.createHeader(basicInformation);
//contents
creator.createContents(basicInformation, purchasedGoodsList);
//footer
creator.createFooter(basicInformation);
} catch (Exception e) {
e.printStackTrace();
}
}
private IReceiptCreator getReceiptCreator(BasicInformation bi) throws Exception {
IReceiptCreator creator = null;
if(bi.getStoreName().equals(STORE_NM_ITAKO)){
creator = new ReceiptCreatorItako();
}else if(bi.getStoreName().equals(STORE_NM_YUKARI)){
creator = new ReceiptCreatorYukari();
}else if(bi.getStoreName().equals(STORE_NM_MAKI)){
creator = new ReceiptCreatorMaki();
}else{
System.out.println("想定外の値:" + bi.getStoreName());
throw new Exception();
}
return creator;
}
}
4.3 IReceiptCreator ー第5章ソースコードー
インターフェース。
package receipt.oop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.util.List;
public interface IReceiptCreator {
public final static String HR = "===============================";
public final static String HR2 = " ----------------------------- ";
public void createHeader(BasicInformation basicInformation);
public void createContents(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList);
public void createFooter(BasicInformation basicInformation);
}
4.4 ReceiptCreatorItako ー第5章ソースコードー
イタコ食堂向けクラス。
package receipt.oop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
public class ReceiptCreatorItako implements IReceiptCreator{
public void createHeader(BasicInformation basicInformation){
System.out.println();
System.out.println(lineFormatCenter(basicInformation.getStoreName()));
System.out.println(basicInformation.getBranchName());
System.out.println();
System.out.println(HR);
}
public void createContents(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
String printStr = null;
BigDecimal sum = new BigDecimal("0");
for(PurchasedGoods goods : purchasedGoodsList){
sum = sum.add(goods.getPrice());
printStr = lineFormatGoodsRow(goods.getGoodsName(), goods.getPrice());
System.out.println(printStr);
}
System.out.println(HR2);
printStr = lineFormatGoodsRow("合計", sum);
System.out.println(printStr);
System.out.println(HR2);
basicInformation.getPaymentAmount().intValue();
printStr = lineFormatGoodsRow("お預り", basicInformation.getPaymentAmount());
System.out.println(printStr);
BigDecimal change = basicInformation.getPaymentAmount().subtract(sum);
printStr = lineFormatGoodsRow("お釣り", change);
System.out.println(printStr);
}
public void createFooter(BasicInformation basicInformation){
System.out.println(HR);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
System.out.println(sdf.format(basicInformation.getPurchaseTime()));
}
private String lineFormatGoodsRow(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s %" + gPriceLen + "d円 ",gName,gPrice.intValue());
}
private String lineFormatCenter(String orgStr){
final int strLen = 31;
int diffStrLen = 0;
for(char c : orgStr.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
int preSpCnt = (strLen - orgStr.length() - diffStrLen) / 2;
//String displayStr = IntStream.range(0, preSpCnt).mapToObj(i -> " ").collect(Collectors.joining("", "", orgStr));
StringBuffer displayStr = new StringBuffer();
for(int i = 0 ; i < preSpCnt; i++) {
displayStr.append(" ");
}
displayStr.append(orgStr);
return String.format("%-"+ (strLen - diffStrLen) +"s",displayStr);
}
}
4.5 ReceiptCreatorYukari ー第5章ソースコードー
ゆかり書房向けクラス。
package receipt.oop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
public class ReceiptCreatorYukari implements IReceiptCreator{
public void createHeader(BasicInformation basicInformation){
System.out.println();
System.out.println(lineFormatCenter(basicInformation.getStoreName()));
System.out.println();
System.out.println(HR);
}
public void createContents(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
String printStr = null;
BigDecimal sum = new BigDecimal("0");
for(PurchasedGoods goods : purchasedGoodsList){
sum = sum.add(goods.getPrice());
printStr = lineFormatGoodsRowYenSign(goods.getGoodsName(), goods.getPrice());
System.out.println(printStr);
}
System.out.println(HR2);
printStr = lineFormatGoodsRowYenSign("合計", sum);
System.out.println(printStr);
System.out.println(HR2);
basicInformation.getPaymentAmount().intValue();
printStr = lineFormatGoodsRowYenSign("お預り", basicInformation.getPaymentAmount());
System.out.println(printStr);
BigDecimal change = basicInformation.getPaymentAmount().subtract(sum);
printStr = lineFormatGoodsRowYenSign("お釣り", change);
System.out.println(printStr);
}
public void createFooter(BasicInformation basicInformation){
System.out.println(HR);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
System.out.println(sdf.format(basicInformation.getPurchaseTime()));
}
private String lineFormatGoodsRowYenSign(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s \\%," + gPriceLen + "d ",gName,gPrice.intValue());
}
private String lineFormatCenter(String orgStr){
final int strLen = 31;
int diffStrLen = 0;
for(char c : orgStr.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
int preSpCnt = (strLen - orgStr.length() - diffStrLen) / 2;
//String displayStr = IntStream.range(0, preSpCnt).mapToObj(i -> " ").collect(Collectors.joining("", "", orgStr));
StringBuffer displayStr = new StringBuffer();
for(int i = 0 ; i < preSpCnt; i++) {
displayStr.append(" ");
}
displayStr.append(orgStr);
return String.format("%-"+ (strLen - diffStrLen) +"s",displayStr);
}
}
4.6 ReceiptCreatorMaki ー第5章ソースコードー
マキマキマーケット向けクラス。
package receipt.oop;
import Basket.BasicInformation;
import Basket.PurchasedGoods;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
public class ReceiptCreatorMaki implements IReceiptCreator{
public void createHeader(BasicInformation basicInformation){
System.out.println();
System.out.println(lineFormatCenter(basicInformation.getStoreName()));
System.out.println(basicInformation.getBranchName());
System.out.println(" " + basicInformation.getAddress());
System.out.println(" " + basicInformation.getPhoneNumber());
SimpleDateFormat sdf = new SimpleDateFormat(" yyyy/MM/dd hh:mm:ss");
System.out.println(sdf.format(basicInformation.getPurchaseTime()));
System.out.println(HR);
}
public void createContents(BasicInformation basicInformation, List<PurchasedGoods> purchasedGoodsList){
String printStr = null;
BigDecimal sum = new BigDecimal("0");
for(PurchasedGoods goods : purchasedGoodsList){
sum = sum.add(goods.getPrice());
printStr = lineFormatGoodsRowNoSign(goods.getGoodsName(), goods.getPrice());
System.out.println(printStr);
}
System.out.println(HR2);
printStr = lineFormatGoodsRowYenSign("合計", sum);
System.out.println(printStr);
System.out.println(HR2);
basicInformation.getPaymentAmount().intValue();
printStr = lineFormatGoodsRowYenSign("お預り", basicInformation.getPaymentAmount());
System.out.println(printStr);
BigDecimal change = basicInformation.getPaymentAmount().subtract(sum);
printStr = lineFormatGoodsRowYenSign("お釣り", change);
System.out.println(printStr);
}
public void createFooter(BasicInformation basicInformation){
}
private String lineFormatGoodsRowYenSign(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s \\%," + gPriceLen + "d ",gName,gPrice.intValue());
}
private String lineFormatGoodsRowNoSign(String gName, BigDecimal gPrice){
final int gNameLen = 20;
final int gPriceLen = 6;
int diffStrLen = 0;
for(char c : gName.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
return String.format(" %-"+ (gNameLen - diffStrLen) +"s %," + gPriceLen + "d ",gName,gPrice.intValue());
}
private String lineFormatCenter(String orgStr){
final int strLen = 31;
int diffStrLen = 0;
for(char c : orgStr.toCharArray()){
if(String.valueOf(c).getBytes().length > 1){
//全角の場合
diffStrLen++;
}
}
int preSpCnt = (strLen - orgStr.length() - diffStrLen) / 2;
//String displayStr = IntStream.range(0, preSpCnt).mapToObj(i -> " ").collect(Collectors.joining("", "", orgStr));
StringBuffer displayStr = new StringBuffer();
for(int i = 0 ; i < preSpCnt; i++) {
displayStr.append(" ");
}
displayStr.append(orgStr);
return String.format("%-"+ (strLen - diffStrLen) +"s",displayStr);
}
}
4.7 BasicInformation ー第5章ソースコードー
前章から変更無いため省略。
4.8 PurchasedGoods ー第5章ソースコードー
前章から変更無いため省略。
この記事が気に入ったらサポートをしてみませんか?