تحسين تلقائي للكود على التزام Android Studio

كما تعلم ، هناك طريقتان للعمل مع git في Android Studio.



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



الطريقة الثانية هي استخدام واجهة المستخدم الرسومية التي يوفرها Android Studio. المزايا واضحة - عتبة دخول منخفضة ، ومن الواضح أكثر ما يمكن القيام به على الإطلاق. وأيضًا هناك أنواع مختلفة من الكعك من الاستوديو نفسه لتسهيل العمل باستخدام git. سيتم مناقشة واحد منهم. بالمناسبة ، باستخدام واجهة المستخدم الرسومية ، يمكنك أيضًا ترك الماوس وشأنه واستخدام مفتاح الاختصار



مفاتيح الاختصار المستخدمة في المقال



Shift + Shift (انقر نقرًا مزدوجًا فوق Shift) - نافذة البحث. يسمح لك بالبحث عن كل من التعليمات البرمجية / الموارد والإجراءات والإعدادات المختلفة.



Ctrl + Alt + L (⌘ + ⌥ + L) -> تنسيق الكود



Shift + Ctrl + Alt + L (⇧ + ⌘ + ⌥ + L) → تنسيق الكود → تنسيق الكود بالمعلمات.



يدعو هذه النافذة

image



ما هو كل هذا وأين تجده؟



عمليات الاستيراد غير ذات الصلة ، والأسطر الفارغة ، والمسافات بدلاً من علامات التبويب - هذه الأشياء تثير الغضب إذا انتهى بها الأمر في الكود الجاهز المخصص لطلب السحب. من السهل إصلاح ذلك باستخدام مفتاح الاختصار Ctrl + Alt + L ، لكننا غالبًا ما ننسى القيام بذلك.

يتيح لك Idea / AndroidStudio تنفيذ هذه الإجراءات تلقائيًا في اللحظة الأخيرة قبل الالتزام



عند استخدام الالتزام من خلال Android Studio ، يمكنك رؤية نافذة مثل هذه:



نحن مهتمون بمربعات الاختيار الموجودة على يمين قائمة الملفات في كتلة ما قبل الالتزام. عند تنشيط هؤلاء المساعدين ، سيتم تطبيقهم تلقائيًا على كل التزام



كيف ستساعدني هذه العلامات بالضبط؟



✓ إعادة صياغة التعليمات البرمجية



يعمل هذا التحسين على جعل الكود متوافقًا مع نمط الكود الخاص بك. الإجراء مشابه تمامًا لـ ctrl + shift + alt + L مع تمكين التنظيف.



يمكنك تخصيص نمط الكود هنا الإعدادات ← المحرر ← نمط الكود



Tab and Indents

code style ( Code Style, )



, ( ), ( )



class CleanTab(context: Context) {

....val date = Date()

....val button = Button(context)
....val textView = TextView(context)
....val ratingBar = RatingBar(context)
....val imageView = ImageView(context)
}




class CleanTab(context: Context) {

-> val date = Date()

-> val button = Button(context)
-> val textView = TextView(context)
-> val ratingBar = RatingBar(context)
-> val imageView = ImageView(context)
}


Spaces

code-style.



Date, button =, args main {



class CleanSpaces(context:Context) {

    val date = Date( )

    val button= Button(context)

    fun main(arg: Args){

    }
}




class CleanSpaces(context: Context) {

    val date = Date()

    val button = Button(context)

    fun main(arg: Args) {

    }
}


Wrapping and Braces

. , / .



else, catch , ( code style)

manyArguments 80 ( code style),



class CleanWrappingAndBraces {

    fun condition() {
        if (liveData != null) {
            <..>
        }
        else {
            <..>
        }
    }

    fun catching() {
        try {
            <..>
        }
        catch (e: Exception) {
            <..>
        }
    }

    fun manyArguments(userId: Int, issuerCountryId: String, sendingCountryId: String, receivingCountryId: String) {

    }
}




class CleanWrappingAndBraces {

    fun condition() {
        if (liveData != null) {
            <..>
        } else {
            <..>
        }
    }

    fun catching() {
        try {
            <..>
        } catch (e: Exception) {
            <..>
        }
    }

    fun manyArguments(userId: Int, issuerCountryId: String,
                    sendingCountryId: String,
                    receivingCountryId: String) {

}


Blank Lines

. ( Code Style, )



}, 2



class CleanBlank {

    fun foo() {

    }

    fun bar() {

    }

}




class CleanBlank {

    fun foo() {

    }

    fun bar() {

    }

}


Rearrange code



, -. XML HTML . Setting → Editor → CodeStyle → XML/HTML → Arrangement



! . Rearrange , , . : LinearLayout, , Button TextView, . —


xmlns , code-style(xmlns:android , xmlns:<...> .

, xmlns:tools xmlns:app , . , rearrange



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:tools="http://schemas.android.com/tools" android:layout_height="match_parent"
    android:orientation="vertical" xmlns:app="http://schemas.android.com/apk/res-auto">

</LinearLayout>




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

</LinearLayout>


android:padding code-style. style android:id



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        android:paddingLeft="8dp"
        android:paddingRight="8dp"
        tools:srcCompat="@tools:sample/avatars" />

    <TextView
        style="@style/TextAppearance.MaterialComponents.Body1"
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World" />

</LinearLayout>




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="8dp"
        android:paddingTop="8dp"
        android:paddingRight="8dp"
        android:paddingBottom="8dp"
        tools:srcCompat="@tools:sample/avatars" />

    <TextView
        android:id="@+id/title"
        style="@style/TextAppearance.MaterialComponents.Body1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World" />

</LinearLayout>


Optimize import



, code style. ctrl+shift+alt+L optimize import.



optimize imports import java.util.* , ,



import android.content.Context
import android.widget.Button
import java.util.*

class RemoveUnused(context: Context) {

    val button = Button(context)
}




import android.content.Context
import android.widget.Button

class RemoveUnused(context: Context) {

    val button = Button(context)
}


n , .

m enum java static ,



Settings → Editor → Code Style → Kotlin → Imports



android.widget android.widget.*



import android.content.Context
import android.widget.Button
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import android.widget.RatingBar
import java.util.*

class MergeImport(context: Context) {

    <..>
}




import android.content.Context
import android.widget.*
import java.util.*

class MergeImport(context: Context) {

    <..>
}


, (m = 0, n=0), ( ) // .

import android.widget. import java.util.



import android.content.Context
import android.widget.*
import java.util.*

class MergeImport(context: Context) {

    <..>




import android.content.Context
import android.widget.Button
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import android.widget.RatingBar
import java.util.*

class MergeImport(context: Context) {

    <..>
}


, ,



import android.content.Context
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import java.util.*
import android.widget.RatingBar

class SortImport(context: Context) {

    <..>
}




import android.content.Context
import android.widget.Button
import android.widget.ImageView
import android.widget.RatingBar
import android.widget.TextView
import java.util.*

class SortImport(context: Context) {

    <..>
}


Perform code analysis



. . — , , , Deprecated



fun TextView.format(message: String) {
   val htmlText = Html.fromHtml(message)
}


, :



Review :



Check TODO



, TODO, . , //TODO, //FIXME, todo, Setting → Editor → TODO.



todo, .



, todo. review todo



Clean up



. (. ), deprecated . Actions → Code cleanup. , .



:



  • deprecated ( )
  • view


! , !


Redutant code
-, .. non-nullable



data class User(val firstName: String, val secondName: String)

val user = User("", "")

fun getUserFullName(): String {
    val firstName = user?.firstName
    val secondName = user.secondName ?: return firstName

    return "$firstName $secondName"
}




data class User(val firstName: String, val secondName: String)

val user = User("", "")

fun getUserFullName(): String {
    val firstName = user.firstName
    val secondName = user.secondName

    return "$firstName $secondName"
}


public, ..



data class User(val firstName: String, val secondName: String)

val user = User("", "")

public fun getUserFullName(): String {
    val firstName = user.firstName
    val secondName = user.secondName

    return "$firstName $secondName"
}




data class User(val firstName: String, val secondName: String)

val user = User("", "")

fun getUserFullName(): String {
    val firstName = user.firstName
    val secondName = user.secondName

    return "$firstName $secondName"
}




class ExecutionClass(val exec: () -> Unit)

val exec = ExecutionClass() {
    doIt()
}




class ExecutionClass(val exec: () -> Unit)

val exec = ExecutionClass {
    doIt()
}


Deprecated

deprecated ReplaceWith(), cleanup . , — , ReplaceWith(). . / . / , ( ), , , . ,





@Deprecated(" ", ReplaceWith("newMethod()"))
fun oldMethod() = Unit

fun newMethod() = Unit

@Deprecated(" ", ReplaceWith("NewClass"))
class OldClass

class NewClass

class GetDeprecatedCodeUseCase(val clazz: OldClass) {

    init {
        val initData = oldMethod()
    }
}




@Deprecated(" ", ReplaceWith("newMethod()"))
fun oldMethod() = Unit

fun newMethod() = Unit

@Deprecated(" ", ReplaceWith("NewClass"))
class OldClass

class NewClass

class GetDeprecatedCodeUseCase(val clazz: NewClass) {

    init {
        val initData = newMethod()
    }
}




, Android Studio . , , , . , .



:



Optimize import Reformat code . .



Rearrange Clean up . , - , (Rearrange) (Clean up)



تحقق TODO و تنفيذ تحليل رمز يمكن أن تستخدم أيضا دون خوف. فهي لا تؤثر على الكود بأي شكل من الأشكال ، بل تعطي فقط تلميحات مزعجة. نعم ، إذا كان كل شيء في مشروعك مبنيًا بالكامل على TODO و Deprecated code ، فلن يكون هناك نهاية لها ، وستكون أكثر إزعاجًا. ولكن إذا كان لديك رمز نظيف إلى حد ما في مشروعك وحاولت تقليل هذه اللحظات ، فسيعطي المساعدون فرصة ممتازة لمراجعة الكود حيث كان من الممكن أن تقوم بحذفه.




All Articles