16 نصائح لتطوير android في Kotlin. الجزء 3

مرحبا مرة أخرى! تحسبا لبدء الدورة التدريبية الأساسية حول تطوير نظام أندرويد ، فإننا نشارك الجزء الأخير من مقالة "16 نصيحة لتطوير android بلغة Kotlin".




اقرأ الجزء الأول
اقرأ الجزء الثاني

LATEINIT


واحدة من الميزات الرائدة في Kotlin هو التزامها بعدم الأمان. يوفر البيان المتأخر طريقة سهلة لضمان عدم الأمان وتهيئة المتغير كما يتطلب Android. هذه الميزة رائعة ، ومع ذلك ، يجب عليك التعود عليها بعد العمل في Java. فكرة واحدة هي أن يتم الإعلان عن الحقل على الفور مع القدرة على أن تكون خالية:

var total = 0 var toolbar: Toolbar? = null 


يمكن أن تسبب وظيفة اللغة هذه صعوبات عند العمل مع تخطيطات Android ، لأننا لا نعرف كيفية إعلان المشاهدات قبل الإعلان عن التخطيط ، لأنه ليس من الواضح أين ستكون موجودة في Activity أو Fragment . يتم تعويض هذا عن طريق اختبارات إضافية لاحتمال وجود قيمة صفرية في كل مكان نتفاعل معه ، ولكن هذا البواسير لا يزال البواسير. لذلك ، من الأفضل استخدام معدل lateinit :

 lateinit var toolbar: Toolbar 

الآن ، كمطور ، يجب ألا تشير إلى شريط الأدوات حتى تتم تهيئته بالفعل. يعمل هذا بشكل رائع عند استخدامه مع مكتبة مثل Butter Knife :

 @BindView(R.id.toolbar) lateinit var toolbar: Toolbar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ButterKnife.bind(this) //       toolbar toolbar.setTitle("Hello There") } 

اكتب السلامة


تتطلب بعض اتفاقيات Android كتابة آمنة لأن الكتابة العادية لا تمنع أخطاء التعليمات البرمجية. على سبيل المثال ، تتضمن الطريقة النموذجية لإنشاء جزء في العمل التحقق من خلال FragmentManager للتأكد من وجوده بالفعل. وفقط إذا لم يكن كذلك ، فأنت تقوم بإنشائه وإضافته إلى الإجراء. عندما تنظر أولاً إلى الكتابة في Kotlin ، يمكنك تنفيذ ذلك على النحو التالي:

 var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as FeedFragment      .  as     ,     .   : var feedFragment: FeedFragment? = supportFragmentManager .findFragmentByTag(TAG_FEED_FRAGMENT) as? FeedFragment if (feedFragment == null) { feedFragment = FeedFragment.newInstance() supportFragmentManager.beginTransaction() .replace(R.id.root_fragment, feedFragment, TAG_FEED_FRAGMENT) .commit() } 

رفع السماح


تتيح لك الرافعة المالية تنفيذ كتلة ما إذا كانت قيمة الكائن غير صفرية. يتيح لك ذلك تجنب عمليات التحقق الفارغة ويجعل الكود أكثر قابلية للقراءة. في Java ، يبدو كما يلي:

 if (currentUser != null) { text.setText(currentUser.name) }   Kotlin   : user?.let { println(it.name) } 

هذا الرمز أكثر قابلية للقراءة ، بالإضافة إلى أنه يقوم تلقائيًا بإنشاء متغير بقيمة غير صفرية دون المخاطرة بتصفيرها.

عسر | ISNULLORBLANK


يتعين علينا التحقق من الحقول عدة مرات أثناء تطوير تطبيق Android. إذا تمكنت من ذلك دون استخدام Kotlin ، فربما تعرف عن فئة TextUtils في Android. فئة TextUtils كالتالي:

 if (TextUtils.isEmpty(name)) { //    } 

في هذا المثال ، ستلاحظ أنه يمكن للمستخدم تعيين حتى مجرد مسافات كاسم المستخدم ، وسوف يجتاز الاختبار. isNullOrEmpty و isNullOrBlank في لغة Kotlin ، مما يلغي الحاجة إلى TextUtils.isEmpty ( someString ) ويوفر فائدة إضافية تتمثل في التحقق من المسافات فقط. إذا لزم الأمر ، يمكنك استخدام شيء مثل هذا:

 //       ... if (number.isNullOrEmpty()) { //     } //  ... if (name.isNullOrBlank()) { //     } 

غالبًا ما يتم التحقق من صحة ملء الحقول عندما يكون التسجيل ضروريًا في التطبيق. تعتبر هذه الطرق المدمجة رائعة للتحقق من الحقل وتنبيه المستخدم إذا كان هناك خطأ ما. لإجراء عمليات تدقيق أكثر تعقيدًا ، يمكنك استخدام طرق الامتداد ، على سبيل المثال ، لعناوين البريد الإلكتروني:

 fun TextInputLayout.isValidForEmail(): Boolean { val input = editText?.text.toString() if (input.isNullOrBlank()) { error = resources.getString(R.string.required) return false } else if (emailPattern.matcher(input).matches()) { error = resources.getString(R.string.invalid_email) return false } else { error = null return true } } 

نصائح للمتقدم


هل تعلم أنه يمكنك استخدام تعبيرات lambda لإنشاء رمز أكثر نظافة وإيجازًا؟

على سبيل المثال ، عند العمل في Java ، من المعتاد أن يكون لديك فئة مستمع بسيطة ، مثل:

 public interface OnClickListener { void onClick(View v); } 

الميزة المميزة في Kotlin هي أنها تقوم بتحويلات SAM (طريقة الخلاصة المنفردة) لفئات Java. مستمع نقرات في Java يشبه:

 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // -  } });  Kotlin     : textView.setOnClickListener { view -> // -  } 

الغريب أن هذا التحويل غير ممكن لواجهات SAM التي تم إنشاؤها في Kotlin. هذا قد يفاجئ المستخدمين الجدد في Kotlin ويخيب أملهم قليلاً. إذا تم تعريف الواجهة نفسها في Kotlin ، فسيبدو المستمع مثل هذا:

 view.setOnClickListener(object : OnClickListener { override fun onClick(v: View?) { // -  } }) 

لتقصير هذا الرمز ، يمكنك كتابة مستمعيك إلى الفصل على النحو التالي:

 private var onClickListener: ((View) -> Unit)? = null fun setOnClickListener(listener: (view: View) -> Unit) { onClickListener = listener } //     onClickListener?.invoke(this) 

سيعيدك هذا إلى صيغة lambda البسيطة التي تجعل تحويل SAM التلقائي ممكنًا.

استنتاج


جمعت أكثر المتسللين فائدة من كل ما تعلمته منذ أن أصبحت مهتمة بلغة Kotlin. آمل أن تساعدك هذه النصائح بشكل كبير في تطوير مشاريعك الخاصة.

هذا كل شيء. أراك في الدورة !

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


All Articles