ざっくりオブジェクト指向プログラミング解説:サンプルコード#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章ソースコードー

 前章から変更無いため省略。

この記事が気に入ったらサポートをしてみませんか?