Eigenschaften versus Methoden







Auf den ersten Blick erscheint eine Frage wie die Auswahl einer Eigenschaft oder Methode einfach. Aber das ist so lange, bis Sie in Ihrem Team auf Missverständnisse stoßen. Obwohl es gut etablierte Praktiken gibt, ist ihr Wortlaut eher vage. In solchen Fragen gibt es einen gewissen Freiheitsgrad, der unsere Wahl erschwert, und die scheinbare Einfachheit bietet einen fruchtbaren Grund für Streitigkeiten.







Hintergrund der Java-Programmierer



— . - . , , 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)
}
      
      





Zweitens ist die Schnittstelle nicht flexibel genug. Manchmal ist es bequem, mit Polarkoordinaten zu arbeiten, in der Schnittstelle jedoch nur mit rechteckigen. Daher legen wir die Implementierung implizit offen.







Lassen Sie uns die Schnittstelle erweitern:







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)
}
      
      





Wie wir sehen können, ist das Entwerfen einer guten Benutzeroberfläche nicht einfach. Obwohl es auf die Datenklasse beschränkt sein könnte:







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






All Articles