2016-08-07 7 views
-4

次のJavaプログラムを作成しました。その基本的な機能は、2つの数値に対して加算、減算、乗算、除算、およびモジュラ除算を実行することです。次のJavaプログラムでカプセル化を導入するにはどうすればよいですか?

私はオブジェクト指向プログラミングの概念を実装しましたが、カプセル化がありません。

カプセル化を導入するにはどうすればよいですか?

私のコードは次のとおりです。

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 


/** 
* 
* @author piyali 
*/ 

public class Calculator { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     // TODO code application logic here 
     int x, y; 
     x = 13; 
     y = 5; 

     calculation add = new calculation(); 
     calculation sub = new calculation(); 
     calculation mul = new calculation(); 
     calculation div = new calculation(); 
     calculation mod = new calculation(); 

     int addResult = add.addition(x, y); 
     int subResult = sub.subtraction(x, y); 
     int mulResult = mul.multiplication(x, y); 
     int divResult = mul.division(x, y); 
     int modResult = mod.modularDivision(x, y); 

     System.out.println("The addition of the numbers is " +addResult); 
     System.out.println("The subtraction of the two numbers is " +subResult); 
     System.out.println("The multiplication of the two numbers is " + mulResult); 
     System.out.println("The division of the two numbers is " +divResult); 
     System.out.println("The modular division of the two numbers is " + modResult); 
    } 
} 

class calculation { 

    int addition(int x, int y){ 
     int z; 
     z = x + y; 
     return(z); 
    } 

    int subtraction(int x, int y){ 
     int z; 
     z = x - y; 
     return(z); 
    } 

    int multiplication(int x, int y){ 
     int z; 
     z = x * y; 
     return(z); 
    } 

    int division(int x, int y){ 
     int z; 
     z = x/y; 
     return(z); 
    } 

    int modularDivision(int x, int y){ 
     int z; 
     z = x % y; 
     return(z); 
    } 
} 
+0

カプセル化には、データメンバ(別名フィールド)の保護が必要であることに注意してください。フィールドがない場合は、カプセル化する必要があるものを公開していません。 – Rogue

+0

ここでは、計算b =新しい計算、b.z = 12、というようなことを簡単に行うことができます。int zがaddition()という関数の外で宣言されていれば、カプセル化が便利になるでしょう。 –

答えて

2

さてあなたは真のOOPとカプセル化をしたい場合は、インタフェースCalculationを作成しますそれは方法int calculate()を有する。

public interface Calculation { 

    int calculate(); 
} 

さてなどAdditionまたはSubtraction

public class Addition implements Calculation { 

    private final int x; 
    private final int y; 

    public Addition(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public int calculate(){ 
     return x + y; 
    } 
} 

主な方法として、このような、このインタフェースを実装するクラスを作成

public static void main(String[] args) { 

    int x, y; 
    x = 13; 
    y = 5; 

    Calculation add = new Addition(x, y); 
    System.out.println(add.calculate()); 
} 
このような設計の

利点は、あなたがいずれかを追加したいかどうということですルート、パーセンテージ、派生さえのような余分な数学的操作を行う場合、クラスの実装を変更する必要はありません。 Calculationを実装する特別なクラスを作成してください。

-3

はゲッターとセッターの概念を使用してください。

class Calculator{ 
private int x, y, z; 

void setValue(int a, int b){ 
    x=a; 
    y=b; 
} 

int getValue(){ 
    return z; 
} 

void addition(){ 
    z=x+y; 
} 

void subtraction(){ 
    z=x-y; 
} 

void multiplication(){ 
    z=x*y; 
} 

void division(){ 
    z=x/y; 
} 

void modDivision(){ 
    z=x%y; 
} 
} 


public class CalculatorTestDrive { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    int num1, num2, result; 

    num1=13; 
    num2=5; 

    Calculator add = new Calculator(); 
    Calculator sub = new Calculator(); 
    Calculator mul = new Calculator(); 
    Calculator div = new Calculator(); 
    Calculator mod = new Calculator(); 

    add.setValue(num1, num2); 
    add.addition(); 
    result = add.getValue(); 
    System.out.println("The addition of " + num1 + " and " + num2 + " is " +result); 

    sub.setValue(num1, num2); 
    sub.subtraction(); 
    result = sub.getValue(); 
    System.out.println("The subtraction of " + num1 + " and " + num2 + " is " +result); 

    mul.setValue(num1, num2); 
    mul.multiplication(); 
    result = mul.getValue(); 
    System.out.println("The multiplication of " + num1 + " and " + num2 + " is " +result); 

    div.setValue(num1, num2); 
    div.division(); 
    result = div.getValue(); 
    System.out.println("The division of " + num1 + " and " + num2 + " is " +result); 

    mod.setValue(num1, num2); 
    mod.modDivision(); 
    result = mod.getValue(); 
    System.out.println("The modular division of " + num1 + " and " + num2 + " is " +result); 
} 

} 
+6

これは既存のコードよりも悪い設計です。もっと冗長でコードが再入可能でなくなりました。つまり、以前は存在しなかったスレッドの問題があります。 –

+2

正しいデザインで自分自身で回答を投稿してください –

0

私はここにカプセル化することはあまりありません。これは基本的な数学ライブラリになりたいと思っているようですが、データメンバーやヘルパー関数がないため、カプセル化するためにここではあまり多くは行えません。

このクラスのインスタンスを作成するのは少し愚かです(たとえばJava Mathライブラリを参照してください)。メソッドを静的にして、コンストラクタをprivateにします。

私はカプセル化の形ではないと思うが、いくつかの設計上のヒント:あなたはfinalを変更しない変数を作るべきです。不要な変数は、使用しない場合はすべて削除する必要があります。読みやすくするために何もしていないし、余分なメモリブロックを使っているだけです(JVMがそれらを最適化しない限り)。

の改善コード:

class calculation { 
    private calculation() { 
     throw new RuntimeException("Don't instantiate a math library!"); 
    } 

    public static int addition(final int x, final int y){ 
     return x + y; 
    } 

    public static int subtraction(final int x, final int y){ 
     return x - y; 
    } 

    public static int multiplication(final int x, final int y){ 
     return x * y; 
    } 

    public static int division(final int x, final int y){ 
     return x/y; 
    } 

    public static int modularDivision(final int x, final int y){ 
     return x % y; 
    } 
} 

これにより、今、あなたはこのようなものを使用して計算ライブラリを呼び出すことができます。

int additionResult = calculation.addition(5, 5); 
System.out.println(additionResult); 
関連する問題