16 conseils de développement pour Android dans Kotlin. 2e partie

Bonjour à tous. En prévision du début du cours de base sur le développement Android , nous continuons à partager du matériel utile.



Avant de lire ces conseils, vous devez lire la documentation de Kotlin et apprendre la langue vous-même sur try.kotlinlang.org . Étant donné que ces conseils visent spécifiquement à utiliser Kotlin dans le contexte du développement Android, vous devez également avoir une expérience avec le SDK Android. Il est également conseillé de se familiariser avec le plugin Kotlin et l'utilisation de Kotlin avec Android Studio de JetBrains (créateurs de Kotlin)



Lire la première partie

Description des objets


Les descriptions d'objets n'autorisent que les singleton, qui ne peuvent pas être confondus avec une classe ayant la capacité de créer des instances. Par conséquent, vous n'avez pas besoin de stocker des singulets en tant que variables d'une classe statique ou dans la classe Application.

Par exemple, si j'ai une classe utilitaire avec des méthodes statiques associées aux threads et que je souhaite accéder à l'ensemble de l'application, vous pouvez le faire:

 package com.myapps.example.util import android.os.Handler import android.os.Looper // ,   ,    object ThreadUtil { fun onMainThread(runnable: Runnable) { val mainHandler = Handler(Looper.getMainLooper()) mainHandler.post(runnable) } } 

ThreadUtil peut être appelé plus tard de la même manière que lors de l'appel d'une méthode de classe statique:

 ThreadUtil.onMainThread(runnable) 

Cela signifie que vous n'avez plus besoin de simuler le comportement d'une classe statique à l'aide d'un constructeur privé et que vous n'avez pas besoin de savoir où l'instance est stockée. Les objets, en fait, sont les éléments originaux du langage. Par le même principe, nous créons des objets au lieu de classes internes:

 iewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) {} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageSelected(position: Int) { bindUser(position) } }); 

Les deux font essentiellement la même chose - ils créent une instance de la classe en tant qu'objet déclaré.

Objets de support


À première vue, Kotlin n'a pas de variables et de méthodes statiques. Il n'y a pas de tels concepts dans ce langage, mais il y a un concept d'objets auxiliaires. Ce sont des objets singleton dans une classe qui contiennent des méthodes et des variables auxquelles vous pouvez accéder de manière statique. Un objet compagnon permet certaines constantes et méthodes, similaires aux classes statiques en Java. Avec lui, vous pouvez suivre le modèle d' extrait de code newInstance .

Jetez un œil à l'objet compagnon dans sa forme la plus simple:

 class User { companion object { const val DEFAULT_USER_AGE = 30 } } //      : user.age = User.DEFAULT_USER_AGE 


Sur Android, nous utilisons généralement des méthodes et des variables statiques pour créer des usines statiques pour les fragments. Par exemple:

 class ViewUserActivity : AppCompatActivity() { companion object { const val KEY_USER = "user" fun intent(context: Context, user: User): Intent { val intent = Intent(context, ViewUserActivity::class.java) intent.putExtra(KEY_USER, user) return intent } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_cooking) val user = intent.getParcelableExtra<User>(KEY_USER) //... } } 

La création d'une intention est similaire à une action similaire en Java:

 val intent = ViewUserActivity.intent(context, user) startActivity(intent) 

Ce modèle est bon car il réduit la probabilité que l' intention ou le fragment ne dispose pas des données nécessaires pour afficher le contenu défini par l'utilisateur ou tout autre contenu. Les objets compagnons sont un moyen de conserver la forme d'accès statique dans Kotlin et doivent être utilisés pour compenser le manque de classes.

Constantes globales


Kotlin vous permet de définir des constantes qui sont visibles à un endroit de l'application (le cas échéant). Mais la portée des constantes doit être minimisée autant que possible. Et dans les situations où vous voulez qu'une région soit globale, Kotlin a un excellent moyen de le faire sans avoir à utiliser une classe constante. Quelque chose comme:

 package com.myapps.example import android.support.annotation.StringDef //   ,  ! const val PRESENTATION_MODE_PRESENTING = "presenting" const val PRESENTATION_MODE_EDITING = "editing" 

Ensuite, ils peuvent être utilisés comme constantes n'importe où dans le projet:

 import com.savvyapps.example.PRESENTATION_MODE_EDITING val currentPresentationMode = PRESENTATION_MODE_EDITING 

Les constantes du projet doivent être aussi petites que possible afin de réduire sa complexité. Si vous avez une valeur qui s'applique uniquement à une classe personnalisée, il est préférable de la placer dans un objet d'assistance.

Extensions


Les extensions sont utiles car elles vous permettent d'ajouter des fonctionnalités de classe sans en hériter. Par exemple, comment ajouter une méthode à une hideKeyboard() comme hideKeyboard() ? En utilisant des extensions, vous pouvez facilement faire ceci:

 fun Activity.hideKeyboard(): Boolean { val view = currentFocus view?.let { val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager return inputMethodManager.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } return false } 

Les extensions sont utiles en ce qu'elles:

  • Aide à améliorer la lisibilité du code
  • éliminer la nécessité de créer des classes et des méthodes utilitaires.

Vous pouvez aller plus loin et améliorer l'architecture du code. Imaginez que vous ayez un modèle de base, par exemple, Article , qui est considéré comme une classe de données extraites d'une source par l'API:

 class Article(val title: String, val numberOfViews: Int, val topic: String) 

Il est nécessaire de déterminer la pertinence de l'article pour l'utilisateur sur la base d'une formule. Devriez-vous le mettre directement dans la classe Article? Et si le modèle ne doit contenir que des données de l'API, rien de plus, les extensions peuvent être réutilisées:

 fun Article.isArticleRelevant(user: User): Boolean { return user.favoriteTopics.contains(topic) } 

Il s'agit actuellement d'un moyen simple de vérifier la présence d'un sujet d'article dans votre liste de sujets favoris.

Cette logique peut varier selon l'endroit où vous souhaitez tester ces attributs et d'autres du comportement de l'utilisateur. Étant donné que cette logique est prise en charge dans une certaine mesure quel que soit le modèle d' article , vous pouvez la modifier en fonction de l'objectif, de la méthode et de sa capacité à être modifiée.

Source: https://habr.com/ru/post/fr480534/


All Articles