« 充電忘れアプリ完成 | トップページ | 割り勘計算機(2) »

2011年1月25日 (火)

割り勘計算機

さて、割り勘計算機です。が、コードを書く前にモデル化しましょう。

まず、割り勘ですが、文章であらわすと、支払い総額に対して各人の支払いが均等になるように請求すること。ですね。

これをクラスにすると

class Warikan extends Object{
  private int number;
  private int totalpayment;
  private int roundup = 100;

  public void setNumber(int n){
    number = n;
  }
  public void setTotalpayment(int total) {
    totalpayment=total;
  }
  public int getPayment(){
    return (int) Math.ceil((double)totalpayment/number/roundup)*roundup;
    }
}

こんな感じなわけです。払いの総額があって、人数があって、たいていはきりのいい額をみんなで出します。が、現実の世の中はこんなにシンプルではありません。

どうなっているかというと、

  1. 立場に応じて額の支払い額の増減がある。
  2. 立場に応じて(0を含む)固定額を支払えばいい場合がある。

というものが主なものですね。つまり、割り勘といっても、中は複数のグループに分割されているのです。

1.でよくあるのは下心満載なフェミニストな男性がよくやる、女性は割引というやつです。

では、まずこれをモデル化しましょう。

割引というのはどういうことかというと、全体の払いに対して負債を作るということです。つまり、男5人、女5人の10人で合計10,000円払う必要があるケースで、女性は500円割引きと決めたとします。ということは全体の支払い額の目標が500*5人分の2,500円増えて12,500円になったということです。
割引の無い男性の支払い額は1,250円、女性は1,250円から500円割り引いて750円です。これで、トータルの払いはやっぱり10,000円です。

このクラスは、さっきのWarikanクラスを継承して表現すると

class DiscountWarikan extends Warikan {
  private int discount ;
  private int number;

  public int getDept(){
    return discount*number;
  }
  public void setDiscount(int d){
    discount=d;
  }
  public int getPayment(int actualPayment) {
    return actualPayment - discount;
  }
}

こんな感じです。getPayment()のところは、このクラスだけでは求めることができないので、とりあえず正規の支払い額というのは教えてもらうことにしています。もちろん、他の人より多く払ってくれる太っ腹な上司というのは差額がマイナスな人として表現できます。

さて、次は2.の定額な人です。このモデル化ですが、実は、定額ということは割り勘ではないのです。つまり、変な話ですが、Warikanクラスにこの人本当に割り勘?という値を返すメソッドを作ります。そして、負債を減らす代わりに割り勘には参加しない人として表現します。

こんな感じです。

class FixedWarikan extends Warikan {
  private int number ;
  private int payment;

  public boolean isWarikan() {
    return false ;
  }
  public int getPayment(){
    return payment;
  }
  public void setFixpayment(int p) {
    payment = p;
  }
  public int getDept() {
    return - number*payment;
  }
}

そして、これらの割り勘グループを複数もった、現実の割り勘クラスというのを作って、

割り勘金額=(支払い総額+負債)/真の割り勘参加者

という形で一人当たりの支払い額を計算し、それを各グループに反映させて各グループの支払い額を求めれば出来上がりです。現実に即したWarikanクラスについては次回に。

なお、ここではモデルの説明に必要なメソッドしか書きませんでしたが、実際にはUIに値を提供するために各種ゲッタが必要なので、コードはもっと長くなります。

« 充電忘れアプリ完成 | トップページ | 割り勘計算機(2) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/60027/50687166

この記事へのトラックバック一覧です: 割り勘計算機:

« 充電忘れアプリ完成 | トップページ | 割り勘計算機(2) »