Propiedades versus métodos







A primera vista, una pregunta como elegir una propiedad o un método parece simple. Pero eso es hasta que te encuentras con malentendidos en tu equipo. Aunque existen prácticas bien establecidas, su redacción es bastante vaga. Hay un cierto grado de libertad en tales cuestiones, lo que dificulta nuestra elección, y la aparente sencillez proporciona un terreno fértil para las disputas.







Antecedentes de los programadores de 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)
}
      
      





En segundo lugar, la interfaz no es lo suficientemente flexible. A veces es conveniente trabajar con coordenadas polares, pero en la interfaz solo rectangulares. Por lo tanto, revelamos implícitamente la implementación.







Ampliemos la interfaz:







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





Como vemos, diseñar una buena interfaz no es fácil. Aunque podría limitarse a la clase de datos:







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






All Articles