Panda Noir

JavaScript の限界を究めるブログです。

Javaでsmall object programmingやってみました

雑誌を立ち読みして覚えたsmall object programming(S-OP)とウェブで得た知識でやってみました。

はじめに

雑誌で書いてたことを参考にしつつ作りました。ただし、全く雑誌のコード自体は覚えてないのでコードは自己流です。

作ったもの

簡単なPersonクラスをつくりました。このどこにS-OPを使ったかというと、名前のところと職業のところです。

名前と職業をそれぞれName、Jobというクラスに分けてあります。まさにSmall Objectですね。分けることで修正をかけやすかったり色々と便利らしいです。私にはそこはよくわかりません。しかし、今までにないような表現ができている気がします。

コード

ちょっと長いです。

class main{
    public static void main(String args[]){
        Person Bill=new Person("Bill","programmer");
        System.out.println(Bill.getName()+","+Bill.getJob()+",$"+Bill.getSalary());
        Bill.setJob("office worker");
        System.out.println(Bill.getName()+","+Bill.getJob()+",$"+Bill.getSalary());
    }
}
class Person{
    private Name myName;
    private Job myJob;
    
    public String getName(){return myName.getName();}
    public String getJob(){return myJob.getJob();}
    public String getSalary(){return Integer.toString(myJob.getSalary());}
    
    public void setName(String name){myName=new Name(name);}
    public void setJob(String job){myJob=new Job(job);}
    
    Person(String name,String job){
        myName=new Name(name);
        myJob=new Job(job);
        if(!isValid()){
            System.out.println("Error");
        }
    }
    public Boolean isValid(){
        if(!myName.isValid())return false;
        if(!myJob.isValid())return false;
        return true;
    }
}
class Name{
    private String myName;
    Name(String name){
        myName=name;
    }
    public Boolean isValid(){
        if(myName.equals(""))return false;
        return true;
    }
    public String getName(){
        return myName;
    }
}
class Job{
    private String myJob;
    Job(String job){
        myJob=job;
    }
    public int getSalary(){
        switch(myJob){
            case "programmer":return 30000;
            case "office worker":return 20000;
        }
        return 0;
    }
    public Boolean isValid(){
        if(myJob.equals(""))return false;
        return true;
    }
    public String getJob(){
        return myJob;
    }
}

まだ、getあたりをなんとかできそうです。でも、面倒になりました。すいません。

このコードを実行すると Bill,programmer,$30000 Bill,office worker,$20000 とでます(実際には二行になってます)。Billの職業をprogrammerからworkerに変えるとちゃんと給料(30000と20000の部分です)が変わります。ちなみにこのコードでBillの名前を""(なし)にするとErrorとでます。

ちなみに

S-OPを使わずにPersonのmyNameとmyJobをString型にすると大変です。多分。よくわかりません。というか今これを書いていて雑誌に書いてあったことと全く違うことをしてることにようやく気が付きました。なにをしていたのだろうか…

終わりに

まあ多分ちゃんとS-OPをやっていると思います。しかし、もし間違っていたら教えて下さい。