Skip to content

Instantly share code, notes, and snippets.

@ZakTaccardi
Created April 4, 2017 22:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ZakTaccardi/ad726135c204d632cfcdd4f7e2cd78a4 to your computer and use it in GitHub Desktop.
Save ZakTaccardi/ad726135c204d632cfcdd4f7e2cd78a4 to your computer and use it in GitHub Desktop.
class TemporalCoupling {
fun incorrectUsageOfBadApi() {
val badApi: BadApi = BadApi()
badApi.username = "Zak"
badApi.password = "temporalCouplingIsBad_123"
badApi.login() //throws an NullPointerException
}
fun correctUsageOfBadApi() {
val badApi: BadApi = BadApi()
badApi.username = "Zak"
badApi.password = "temporalCouplingIsBad_123"
badApi.url = "http://my-endpoint.com"
badApi.login() //works
}
fun correctUsageOfGoodApi() {
val goodApi: GoodApi = GoodApi(url = "http://my-endpoint.com")
//hard to call this function incorrectly
goodApi.login(
username = "Zak",
password = "temporalCouplingIsBad_123"
)
}
class GoodApi(private val url: String) {
fun login(username: String, password: String) {
NetworkCall(url, username, password).execute()
}
}
class BadApi {
var url: String? = null
var username: String? = null
var password: String? = null
fun login() {
NetworkCall(url!!, username!!, password!!).execute()
}
}
data class NetworkCall(val url: String, val username: String, val password: String) {
fun execute() {
//does nothing..
}
}
data class Password(val password: String) {
init {
if (password.length < 10) {
throw IllegalStateException("Password must be at least 10 characters")
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment