Ăber mich
GrĂŒĂe an alle. Mein Name ist Vyacheslav, ich arbeite seit 11 Jahren in der IT in Richtung Android. Ich berĂŒhrte und streichelte Dinosaurier angesichts von Android 1.5 und 1.6 und durchlief alle Phasen der Bildung von MVP MVVM Retrofit und vielen anderen Bibliotheken. Ich habe meinen alten Code oft als ein Haufen g ... angesehen und lerne und entwickle mich weiter. Ich habe es geschafft, mehr als ein Dutzend zu lernen, ich habe keine Angst vor diesem Wort, "starke" Jungs, mit gutem Potenzial und einem Kopf auf den Schultern, wĂ€hrend des Trainings wurden Regeln und Empfehlungen gebildet, die ich teilen möchte .
Ăber Artikel
In letzter Zeit bin ich auf viele Projekte unterschiedlicher KomplexitĂ€t gestoĂen und sehe ein natĂŒrliches Problem. AnfĂ€nger sehen den Wert von Konzepten wie Clean Code, KISS und SOLID nicht. Wir können uns darauf einigen, dass Clean Code alles andere als fĂŒr AnfĂ€nger geeignet ist, aber ich denke, dass allgemein Kenntnisse ĂŒber diesen Ansatz erforderlich sind. Fortgeschrittene Programmierer wenden diese AnsĂ€tze nicht vollstĂ€ndig an. Erfahrene Programmierer gehen oft zu tief ins Detail und vergessen die wichtigsten Dinge. FĂŒr AnfĂ€nger: Dieser Artikel hilft Ihnen dabei, Regeln fĂŒr sich selbst zu sammeln, die es wert sind, beachtet zu werden.
FĂŒr Erfahrene: Definieren Sie Ihre Ansichten neu oder tauchen Sie in die Details moderner CodierungsansĂ€tze ein.
FĂŒr Profis: Betrachten Sie moderne AnsĂ€tze aus einem anderen Blickwinkel (hoffentlich). Manchmal ist es hilfreich, einen Schritt zurĂŒckzutreten und sicherzustellen, dass Sie auf dem richtigen Weg sind.
, , . . Clean Code.
Clean Code
, , .
âClean Codeâ. , . . - , ( ). - , . : â â. - 2 , - - â. , - . . , 100 . . 2 ? - , - , . .. - , . âtransformDateToStringâ âtransDTSâ. â â - ââ, â â - . ââ ââ, ââ . . , . : - .
KISS
KISS (keep it simple, stupid). , . - , , , . . SOLID, , , , - , . .
interface Factory<out T> {
fun create(): T
}
typealias PrinterFun = (String) -> Unit
interface PrinterFactory : Factory<PrinterFun>
interface MessageFactory : Factory<String>
interface MessagePrinter {
fun print(pf: PrinterFactory, mf: MessageFactory)
}
class PrinterFactoryImpl : PrinterFactory {
override fun create(): PrinterFun = ::print
}
class MessageFactoryImpl : MessageFactory {
companion object {
const val DEFAULT_MESSAGE = "Hello World"
}
override fun create(): String = DEFAULT_MESSAGE
class MessagePrinterImpl : MessagePrinter {
override fun print(pf: PrinterFactory, mf: MessageFactory) {
pf.create().invoke(mf.create())
}
}
class ImplProvider {
private val impls = HashMap<KClass<out Any>, Any>()
fun <T : Any> setImpl(clazz: KClass<T>, t: T) {
impls[clazz] = t
}
fun <T : Any> getImpl(clazz: KClass<T>): T {
return (impls[clazz] as? T) ?: throw Exception("No impl")
}
}
fun main(args: Array<String>) {
val implProvider = ImplProvider()
implProvider.setImpl(PrinterFactory::class, PrinterFactoryImpl())
implProvider.setImpl(MessageFactory::class, MessageFactoryImpl())
implProvider.setImpl(MessagePrinter::class, MessagePrinterImpl())
implProvider.getImpl(MessagePrinter::class)
.print(implProvider.getImpl(PrinterFactory::class),
implProvider.getImpl(MessageFactory::class))
}
âHello worldâ? ââ - .
class TimeFormatter {
private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
fun formatTime() = timeFormat.format(Date())
}
. (UNIT ) . , . .
SOLID
ââ : SOLID! , , - . . , - , - , , . - , . â â, â â, .
S - single responsibility
[WIKI] (single responsibility principle). . , , .
: â â.
â â, - , , . 20 1-2 (TextEditUtils, TextTransformUtils, TextConcatUtils ) - TextUtils . , , . GOD-CLASS . , , . . - . , - . , - ( , ).
O - openâclosed
[WIKI] /. « ⊠, ».
â ( )â. , , .
. â ?â. - , ? , - , . . - - , . :
open class UiComponent() {
var mode : Int = 0
fun showTextAndImage(text:String, image: Image){
mode = 0
...
}
fun showButton(text:String, action: Runnable){
mode = 1
...
}
...
}
, -:
class MyUiComponent(): UiComponent(){
fun doMagic(){mode = 3}
}
- â â, â? , ?â . , , , , , . âmodeâ , - . , ( ), .
, , , , .
L - Liskov substitution
[WIKI] . « ». .
, . , . . â â. , , , . .
. . âDownloaderâ âdownloadFile(url)â. , , . âDownloaderâ , . ( ) Downloadable:
class DownloadManager() {
fun download(downloadable: Downloadable) {
val stream = downloadable.openStream()
val file = File(downloadable.getFileName())
//
}
}
interface Downloadable {
fun openStream(): InputStream
fun getFileName(): String
}
class SimpleDownloadableFile(val name: String,
val url: String) : Downloadable {
override fun openStream() = URL(url).openStream()
override fun getFileName() = name
}
class HeaderFile(val name: String,
val url: String,
val headers: Map<String, String>) : Downloadable {
override fun openStream(): InputStream {
/* */
}
override fun getFileName() = name
}
( ) ( , + )
- , . . - :
interface Something
interface SomethingSpecific : Something
interface WritableSomething : SomethingSpecific {
fun writeToFile()
}
interface GetableWritable<T> : WritableSomething {
fun obtain(): T
}
abstract class ObtainableFile(val name: String) : GetableWritable<File> {
override fun obtain() = File(name)
override fun writeToFile() = obtain().write(getStream())
abstract fun getStream(): InputStream
}
class UrlFile(url: String, name: String) : ObtainableFile(name) {
override fun getStream(): InputStream = URL(url).openStream()
}
, . , KISS. PS: âŠ
I - interface segregation
[WIKI] . « , , , ».
. - â â . - ââ, âinterface / abstract classâ.
ââ â â . 1000 , , java interface, .
ââ - , . ( Utils) . . â â, .
. ââ ââ, S (Single responsibility). Open-close . Liskov substitution .
D - dependency inversion
[WIKI] . « . - ».
, , . . . , . : single responsibility, ( , , , ). : . , Liskov substitution ââ, , .
: . :
open class ServerManager {
open fun getData(): String = " "
}
open class CacheManager {
open fun saveData(data: String) {/* / */}
}
class DataManager{
fun getDataAndCache(){
val data = ServerManager().getData()
CacheManager().saveData(data)
}
}
, / ââ, .
- . DataManager :
class DataManager(private val serverManager: ServerManager,
private val cacheManager: CacheManager) {
fun getDataAndCache() {
val data = serverManager.getData()
cacheManager.saveData(data)
}
}
. , ( , - ).
Clean Architecture , . ââ :
interface ServerManager {
fun getData(): String
}
open class ServerManagerImpl : ServerManager {
override fun getData(): String = " "
}
interface CacheManager {
fun saveData(data: String)
}
open class CacheManagerImpl : CacheManager {
override fun saveData(data: String) {
/* / */
}
}
interface DataManager {
fun getDataAndCache()
}
class DataManagerImpl(
private val serverManager: ServerManager,
private val cacheManager: CacheManager,
) : DataManager {
override fun getDataAndCache() {
val data = serverManager.getData()
cacheManager.saveData(data)
}
}
fun foo(){
val dataManager: DataManager = DataManagerImpl(
ServerManagerImpl(),
CacheManagerImpl()
)
dataManager.getDataAndCache()
}
( ) , ( ).
(Dagger, Koin, ServiceLocator ), . , , :
interface TextProvider {
fun getText(): String
}
class SimpleTextProvider(private val text: String) : TextProvider {
override fun getText(): String = text
}
class Printer(private val textProvider: TextProvider) {
fun printText() {
println(textProvider.getText())
}
}
fun main() {
Printer(SimpleTextProvider("text")).printText()
}
, , SOLID , Dependency injection. . . , - KISS.
ââ, , . - . â â , , . ( - Adapter-, , ).
, â â, , . . , . - . - . , , - : . (MVP, MVVM ) , ( -, - âŠ). , . , . .
âClean architectureâ. . , - . âClean architecture â, , , . - . Hello World , ?
, , ( , ). ââ. - , .
â â
â ?â, . , , : . , , . . . , , ? - 2 , .. ⊠. - . ? , , ââ . .
. .
- . â â, â â. â â . â â - . : - , , .
- . ( ) . , . ââ ( /).
AbschlieĂend möchte ich an einen sehr nĂŒtzlichen Rat im Internet erinnern: âSchreiben Sie den Code so, als wĂŒrde er von einem VerrĂŒckten gelesen, der weiĂ, wo Sie leben.â Schreiben Sie guten Code, und möglicherweise kommen Kaffee und Kekse mit.