プロパティとメソッド







一見、プロパティやメソッドの選択などの質問は簡単に思えます。しかし、それはあなたがあなたのチームで誤解にぶつかるまでです。確立された慣行がありますが、それらの表現はかなり曖昧です。そのような質問にはある程度の自由度があり、それが私たちの選択を困難にし、明白な単純さが論争の肥沃な根拠を与えます。







Javaプログラマーの背景



— . - . , , Java , .







:







public class Point {
    public double x;
    public double y;
}
      
      





, . ? -, , . -, , .







, , , :







public class Point {

    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
}
      
      





Java, IDE .

get set.







, , .









get set:







class Point(var x: Double, var y: Double)
      
      





, ? : x



getX()



.







:







var x: Double = 0 
    set(value) {
        if (value >= 0) field = value
    }
      
      





, . , .







, . , Java get set , . , . ? , .









, read-only .







, , :







  • (exception)
  • ( )
  • ,


. -, . .







, User:







class User(
    val firstName: String,
    val lastName: String
)
      
      





?







val fullName get() = "$firstName $lastName"
      
      





String, . equals. fullName, .







.









, . ? , , . -: , . , , .







:







class DocumentModel {
     val activePageIndex: Int
}
      
      





, activePageIndex, . , , , :







images.forEach { image ->
   document addImage(image, document.activePageIndex)
}
      
      





, , , . , :







val pageIndex = document.activePageIndex
images.forEach { image ->
   document addImage(image, pageIndex)
}
      
      





, . , , , . , . , - -, , findActivePageIndex.









, , , . , . , . , , ? — . Java . , , get set .







, -, . , API . . , API , .







, IDE, . , . , .







— , . . , . . , .









, , , . . , ?







. , :







  • . , . .
  • . , . .

    .


, .







, get/set, .




, :







interface Point {
    var x: Double
    var y: Double
}
      
      





?







-, x y. , , . , .







x y :







interface Point {
    val x: Double
    val y: Double
    fun setCoordinates(x: Double, y: Double)
}
      
      





第二に、インターフェースは十分な柔軟性がありません。極座標で作業すると便利な場合もありますが、インターフェイスでは長方形のみです。したがって、実装を暗黙的に開示します。







インターフェイスを拡張してみましょう:







interface Point {
    val x: Double
    val y: Double
    val radius: Double
    val angle: Double
    fun setCartesian(x: Double, y: Double)
    fun setPolar(radius: Double, angle: Double)
}
      
      





ご覧のとおり、優れたインターフェースの設計は簡単ではありません。データクラスに限定することもできますが、







data class Point(
    var x: Double,
    var y: Double
)
      
      






All Articles