
À première vue, une question comme le choix d'une propriété ou d'une méthode semble simple. Mais c'est jusqu'à ce que vous rencontriez des malentendus dans votre équipe. Bien qu'il existe des pratiques bien établies, leur formulation est plutôt vague. Il y a un certain degré de liberté dans ces questions, ce qui rend notre choix difficile, et l'apparente simplicité donne un terrain fertile aux disputes.
Contexte des programmeurs 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 , . , . ? , .
, , :
- (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)
}
Deuxièmement, l'interface n'est pas assez flexible. Parfois, il est pratique de travailler avec des coordonnées polaires, mais dans l'interface uniquement des coordonnées rectangulaires. Ainsi, nous divulguons implicitement l'implémentation.
Développons l'interface:
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)
}
Comme on peut le voir, concevoir une bonne interface n'est pas facile. Bien que cela puisse être limité à la classe de données:
data class Point(
var x: Double,
var y: Double
)