Hardcoding (shuningdek, hard-coding yoki hard coding) - bu to'g'ridan-to'g'ri dastur qismi yoki ob'ekt sifatida ma'lumotlarni manba kodi(source code) ga yozib qo'yish orqali dasturiy ta'minotni ishlab chiqish amaliyoti. 

Wikipedia

Tasavvur qiling, sizning loyihangizda 20-25 ta layout (.xml) va 30-40 ta sinf (.class) fayllari bor. Quyidagi kodlar shu dasturning kamida 20ta faylida bir necha marta ishlatilgan. 

<TextView
    android:layout_width="match_parent"
    android:layout_height="54dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="12dp"
    android:layout_marginEnd="24dp"
    android:background="#E91E63"
    android:padding="16dp"
    android:text="Some text "
    android:textColor="#CC2196F3"
    android:textSize="12sp" />
TextView txt = new TextView(context); 
txt.setText("Some other text"); 
txt.setTextSize(16); 
txt.setTextColor(Color.argb(255, 255, 132, 138));

Endi quyidagi o’zgarishlar qilish kerak: 

  1. Dastur 3xil tilda bo’lishi kerak: Ingliz, Rus va O’zbek
  2. Dasturning tungi rejimi bo’lishi kerak (Dark mode)
  3. Dastur planshet yoki katta ekranli telefonlarga moslashtirish kerak.
  4. va h.k.

 

Shuncha o’zgarishlarni amalga oshirish uchun sizga 2-3 soat vaqt berishsa, ulgurarmidingiz? Albatta yo’q! Agar berilgan vaqtda bemalol o’zgartirishga ulguraman deb javob bergan bo’lsangiz, quyidagilarni ham hisobga olin: 

  1. Loyihani 2-3ta odam kod yozgan bo’lishi mumkin va kim, qayerda bu kodlarni ishlatganligini o’zlari ham bilmasliklari mumkin.
  2. Yuqoridagi holatdan kelib chiqib, siz barcha fayllarni tekshirib chiqishingiz kerak bo’ladi. (o’rtacha .class fayli 300-600, layout.xml fayli 200-400 qatorli kod)

 

Nima uchun 2-3 soatli ishni biz 2-3 kunlab qilyapmiz deb o’ylayotgan bo’lsangiz kerak. Buning sababi boshlang’ich kod sifatsiz yozilganligida(ha, kodning ham xuddi olma kabi sifati bo’ladi) ya’ni Hardcoding dan foydalanilganiga. Shuning uchun endi Hardcoding dan maksimal darajada qochishga harakat qilamiz. 

 

Matnlar (Strings)

Matnlarni keyinchalik boshqa tillar uchun qo’llash uchun ularni har doim 1ta faylda yozib olib, dasturning ixtiyoriy qismidan shu faylni chaqirib olib matnlarni olishingiz kerak(Qaysi dasturlash tili yoki muhitdan foydalanishingiz va keyinchalik matnlar tarjimasi kerak bo'lish bo'lmasligidan qat’iy nazar har doim 1ta fayl matnlar uchun ajratilishi kerak). Agar Android Studio dan foydalanayotga bo’lsangiz, siz uchun maxsus strings.xml fayli yaratilgan.

Endi barcha matnli ma’lumotlarni strings.xml fayliga yozishingiz kerak. 

Keyin bu matnlarni dasturning boshqa qismlarida ishlatishimiz uchun ularning name dan foydalanamiz, shu sababli ular unikal bo’lishi kerak. <string...> </string> teglari orasidagi qiymat esa bizning matnimiz hisobladi. Yangi loyiha ochganingizda strings.xml fayli har doim app_name (dasturning nomi, agar dasturni nomini o’zgartirmoqchi bo’lsangiz, shu qiymatni o’zgartirasiz) bo’ladi.  

 layout (.xml) fayllarida ushbu matnlarni ishlatish uchun ularni name bilan chaqirish kerak bo’ladi. Ya’ni quyidagicha: 

<TextView
...
android:text="@string/text_btn"/>


<EditText 
...
android:hint="@string/login_hint"/>
  • @string – biz ma’lumotni strings.xml dan olayotganligimizni bildiradi.
  • text_btn, login_hint strings.xml dagi matnlarning name lari.

 

Dastur kodida(.class) matnlar quyidagicha chaqiriladi: 

String someText = getString(R.string.my_text); 

yoki 

String someText = getContext().getString(R.string.my_text); 

  • R.string.my_text – biz strings.xml faylidagi my_text nomli matnni id sini oldik.
  • getString(…)R.string.my_text ga tegishli id dagi matnni oldik

 

Endi eng asosiysi boshqa tilni qanday qo’shamiz???  

Android Studio da lokalizatsiya qilish juda oson buning uchun strings.xml fayliga kirib Open editor ga bosamiz .

strings.xml
strings.xml
Open Editor bosilganda hosil bo'ladigan oyna
Open Editor bosilganda hosil bo'ladigan oyna

Ochilgan oynadan Add locale ni bosamiz (globus ikonasi) va kerakli tilni tanlaymiz.

Yangi til qo’shildi endi har bir matnni tarjimasini kiritib chiqish qoldi, shu tarzda ko’nglizga sig’ganicha til qo’shishingiz mumkin.

 

Qo’shimcha: 

  • Shunday matnlar bo’ladi ularga tarjima shart emas, shunday matnlar uchun Untranslatable (checkbox) ni tanlash kerak bo’ladi
  • Natijani ko’rish uchun dasturni telefoningizga o’rnating va telefon sozlamalaridan tilni almashtirib dasturga qayta kiring.
  • Agar biror matnni qiymatini kiritmasangiz, masalan biror matnni o’zbekcha, inglizcha tarjimasini kiritib ruscha tarjimasini kiritish yodingizdan chiqdi. Shunday hollarda tarjimasi yo’q matnlarni Default Value qatorida turgan qiymati ishlatiladi

 

O’lchamlar (Dimensions) 

Android Studioda o’lchamlar uchun alohida fayl mavjud. Bu values papkadagi dimens.xml fayli. Yangi loyiha ochilgan paytda bu fayl bo’lmaydi, shuning uchun uni o’zingiz qo’shishingiz (New->Values Resource File) kerak bo’ladi. dimens.xml faylida .xml faylida ishlatiladigan, o’lchov bilan bo’g’liq barcha ma’lumotlani joylashtirishimiz kerak. 

.xml faylida quyidagicha foydalanishimiz mumkin. 

<TextView 
 ...
android:layout_height="@dimen/textHeight" 
android:layout_marginStart="@dimen/margin" 
android:layout_marginEnd="@dimen/marginHalf" 
android:padding="@dimen/paddingStandart" 
android:textSize="@dimen/colors_text_size" 
.../> 

 

Dastur kodida esa quyidagicha foydalaniladi.

float size =getResources().getDimension(R.dimen.card_elevation); 

yoki 

float size = getContext().getResources().getDimension(R.dimen.card_elevation); 

 

Nima uchun o’lchamlarni to’g’ridan to’g’ri ishlatmaymiz? Dastur maketini yaratayotgan paytimizda biror bir shartga asosan yaratamiz, masalan asosiy matn katta ko’rinsin, uning izohi esa sal kichikroq va biz bu shartni dasturni boshidan oxirigacha amal qilmoqchimiz, lekin dasturni ishga tushirganimizda matnlar juda katta/kichiklik qildi, shunday paytda siz barcha matnlarni kattaligi to’girlab chiqish o’rniga dimens.xml orqali 1-2 belgi to’girlaysiz va bu bilan turli o’lchamlarni o’zgartirib natijalarni o’zigizga ma’qul keladigan qiymatlarni belgilashingiz mumkin. Masalan, ekran o’lchami turli xil bo’lgan telefonlar uchun turli o’lchamlarni ishlatmoqchisiz, buning uchun yana 1ta dimens.xml faylini yaratib olasiz lekin endi Available qualifiers ni tanlash kerak (ya’ni yaratayotgan faylimiz qachon ishlash kerakligini bildiradi) 

 

Screen Width ni tanlab >>  belgini bosamiz va kerakli qiymatni kiritamiz 

 

Endi biz ekran kengligi 600dp (yoki siz kiritgan qiymat) ga teng yoki undan katta bo’lgan telefonlar uchun ishlatiladigan dimens.xml fayli mavjud.

Ekran kengligi
Ekran kengligi 600dp ga teng yoki katta bo'lgan telefon uchun yaratilgan dimens.xml fayli

 

dimens.xml fayli

 

Bizning dasturimiz endi ekran kengligi 600dp dan kichkina bo’lgan telefonda matn o’lchami 18sp/16sp bo’ladi, 600dp ga teng yoki katta bo’lgan telefonlar uchun matn o’lchami  24sp/20sp bo’ladi. Vo ajabo, biz 2ta qatorni o’zgartirish orqali butun boshli dasturdagi barcha matn o’lchamlarini o’zgartirdik.  

 

Qolgan o’lchamlarchi?

Biz faqat matnlarni o’zgartirdik qolgan o’lchamlarga nima bo’ladi, axir biz ularni yozmadikku deb o’ylayotgan bo’lsangiz, xavotirga o’rin yo’q yozilmagan barcha o’lchamlar default dimens.xml dan olinadi.

 

Biz qayerdan bilamiz qaysi fayl default ekanligini?   

 

Barcha dublikat fayllar qaysi biri nimaga javob berishi (qisqartmasi) uni oldidagi qavslarda ko’rsatiladi. Agar qavs bo’lmasa demak shu fayl default fayl hisoblanadi. Bu nafaqat dimens.xml da balki barcha .xml fayllar uchun amal qiladi. 

 

Massivlar (Arrays) 

Agar maqolani shu yergacha o’qigan ekansiz, quyidagi kod qanday yozilishi kerak ekanligini o’ylab ko’ring (bu yerda 3ta matn qatnashgan massiv): 

String[] array = new String[3]; 
 
array[0] = "It's"; 
array[1] = "me"; 
array[2] = "Mario"; 

 

… 

 

Agar sizning javobinngiz quyidagicha bo’lsa, topg’irligingiz uchun Griffindorga 10 ball 

String[] array = new String[3]; 
 
array[0] = getString(R.string.it_s); 
array[1] = getString(R.string.me); 
array[2] = getString(R.string.mario);

yoki

String[] array = new String[3]; 
 
array[0] = getContext().getString(R.string.it_s); 
array[1] = getContext().getString(R.string.me); 
array[2] = getContext().getString(R.string.mario);

 

Ammo, lekin, biroq buni ham soddalashtirishimiz mumkin. Buning uchun dimens.xml va strings.xml ning oldiga arrays.xml faylini yaratamiz. 

 

Endi massiv  yaratish uchun string-array tegidan foydalanmiz. 

<string-array name="who_are_you">
        <item>@string/it_s</item>
        <item>@string/me</item>
        <item>@string/mario</item>
</string-array>

 

<item></item> tegi orqali biz massiv elementlarini berishimiz mumkin. Bu yerda massiv qiymatlari strings.xml faylida joylashgan matnlarni o’zlashtiryapti. Esingizda bo’lsa biz strings.xml faylini bir nechta tilga tarjima qilgan edik, endi dastur tili o’zgarsa avtomatik tarzda biz yuqorida yaratgan massiv (string-array) qiymatlari ham o’zgaradi. Demak, bizda massiv tayyor endi uni dastur kodiga quyidacha chaqirib olishimiz mumkin. 

String[] array =getResources().getStringArray(R.array.who_are_you); 

yoki 

String[] array = getContext().getResources().getStringArray(R.array.who_are_you); 

 

Ranglar (Colors) 

Ranglarni ham huddi matn va o’lcham kabi 1ta alohida faylda saqlash kerak.  

layout (.xml) faylida quyidagicha ishlatiladi. 

 

<TextView 
...
android:textColor="@color/light_black" 
android:background="@color/pager_blue" /> 

 

Dastur kodi(.class)da esa quyidagicha 

ContextCompat.getColor(this, R.color.black) 

yoki 

ContextCompat.getColor(getContext(), R.color.black

Misol uchun  

view.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.black)); 

 

Maqolaning boshidagi kod esingizdami?

<TextView 
	android:layout_width="match_parent" 
	android:layout_height="54dp" 
	android:textColor="#CC2196F3" 
	android:text="Some text " 
	android:textSize="12sp" 
	android:background="#E91E63" 
	android:layout_marginStart="16dp" 
	android:layout_marginEnd="24dp" 
	android:layout_marginTop="12dp" 
	android:padding="16dp" /> 

 

Keling endi o’rganganlarimiz bo’yicha to’g’irlab yozamiz.

<TextView 
style="@style/textTitle" 
android:text="@string/text_btn" />

Stop, stop, stop... ◉_◉ @style ???? Qani biz o’rgangan @dimen, @color degan bo’lsangiz, e’tiborligingiz uchun Griffindorga 20 ball

 

Stil (Style) 

Har bir narsaning o’ziga hos stili bo’lgani kabi dasturlashda ham elementlarni stili mavjud. Masalan siz textSize ishlatdingiz demak sizga kerakli element boshqalaridan ajralishi kerakligi ya’ni o’ziga hos bo’lishini hohlayapsiz. Quyidagi jadvalni hosil qilish uchun 2xil ko’rinishdagi TextView kerak:

 

FIO Darth Vader 
Address The Death Star 
Tel +442894630 
E-mail darth_vader@dark_side.com 

 

  • FIO, Address, Tel, E-mail uchun
<TextView 
	android:layout_width="@dimen/text_label_width" 
	android:layout_height="wrap_content" 
	android:layout_marginStart="@dimen/margin" 
	android:layout_marginEnd="@dimen/margin" 
	android:padding="@dimen/paddingHalf" 
	android:textSize="@dimen/text_size_16" 
	android:textColor="@color/light_black" 
	android:fontFamily="sans-serif-medium" 
	android:text="@string/text_label" />

 

<TextView
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_marginStart="@dimen/marginHalf"
	android:layout_marginEnd="@dimen/marginHalf"
	android:padding="@dimen/paddingHalf"
	android:textSize="@dimen/text_size_18"
	android:textColor="@color/black"
	android:textStyle="italic"
	android:text="@string/text_value" />

 

Bizning jadvalimizda shu 2 ta TextView lar 4 martadan qaytarilyapti va faqat android:text ning qiymati o’zgaryapti. Biz 1 ta qiymatni o’zgartirish uchun unga qo’shib ya’na 8 ta qiymatni qayta yozayapmiz. Buni oldini olish uchun Android Studio da themes.xml fayli mavjud. 

 

Bu faylni shablon fayli desa ham bo’ladi. Nega deysizmi? Tasavvur qiling, bizda avtomobil zavodi bor va biz Nexia 2 va Nexia 3 avtomobillarini ishlab chiqaramiz. Har safar kerakli ma'lumotlarni qayta hisoblab chiqmaslik uchun biz ularni parametrlarini oldindan shablon qilib olamiz. 

 

Va endi har safar Nexia 2 yoki Nexia 3 ishlab chiqarayotganimizda uning parametrlarini quyidagicha e’lon qilamiz

 

Endi quyidagi o’zgarishlarni qiling: 

  1. Avtomobil zavodi – bizning dastur
  2. Nexia 2 FIO, Address, Tel, E-mail uchun yaratilgan TextView  ( text_label deb nomlaymiz)
  3. Nexia 3 – Darth Vader,  The Death Star,  +442894630,  darth_vader@dark_side.com   uchun  yaratilgan TextView ( text_value deb nomlaymiz)
  4. Uzunligi, o’rindiqlar soni, rangi, maksimal tezligi, narxi – TextView ni attributlari
<style name="text_label"> 
	<item name="android:layout_width">@dimen/text_label_width</item> 
	<item name="android:layout_height">wrap_content</item> 
	<item name="android:layout_marginStart">@dimen/margin</item> 
	<item name="android:layout_marginEnd">@dimen/margin</item> 
	<item name="android:padding">@dimen/paddingHalf</item> 
	<item name="android:textSize">@dimen/text_size_16</item> 
	<item name="android:textColor">@color/light_black</item> 
	<item name="android:fontFamily">sans-serif-medium</item> 
</style> 
 
 
<style name="text_value"> 
	<item name="android:layout_width">@dimen/text_label_width</item> 
	<item name="android:layout_height">wrap_content</item> 
	<item name="android:layout_marginStart">@dimen/marginHalf</item> 
	<item name="android:layout_marginEnd">@dimen/marginHalf</item> 
	<item name="android:padding">@dimen/paddingStandart</item> 
	<item name="android:textSize">@dimen/text_size_18</item> 
	<item name="android:textColor">@color/black</item> 
	<item name="android:textStyle">italic</item> 
</style> 

 

Endi bizning kodimiz quyidagi ko'rinishga keladi. 

<TextView 
style="@style/text_label" 
android:text="@string/fio" />  
 
<TextView 
style="@style/text_value" 
android:text="@string/darth_vader" /> 

Ya’ni barcha takrorlanuvchi elementlarni theme.xml ga yozib qo’ydik. 

 

Va yuqoridagi jadvalni yaratish uchun yoziladigan TextView lar quyidagicha ko’rinishga ega bo’ladi.

 

O’zgarmaslar (Constants) 

Dastur kodida o’zgarmaslardan to'g'ridan - to'g'ri foydalanmang. Masalan,

double variable = 3.14 * radius * radius; 

Bu yerda 3.14 o’zgarmas son lekin uni bunday ishlatilishi - Hardcoding 

Agar o’zgarmas qiymatlar faqat 1 ta sinf (class) da ishlatilayotgan bo’lsa ularni ushbu sinf(class) boshida e’lon qilib qo’yish kerak. Hatto bu qiymatni 1 marta ishlatsak ham uni alohida e’lon qilish kerak. 

private static final double PI = 3.14; 
...
double variable = PI * radius * radius; 

 

Agar o’zgarmas qiymat dasturning bir nechta sinf (class) da ishlatilsa unda bunday qiymatlarni alohida faylda saqlash kerak 

 

Nima uchun class emas interface

interface e’lon qilinganligi sababi uning ichida e’lon qilingan barcha o’zgaruvchilar static final hisoblanada (static - dasturning ixtiyoriy qismida obyekt yaratmasdan class nomi orqali chaqirish mumkin ya’ni constVar.serverUrl ko’rinishida va final - qiymati o’zgarmas ya’ni unga yangi qiymat o’zlashtirib bo’lmaydi, bu dastur paytida uning qiymati o’zgarib qolmasligini kafolatlaydi) ya’ni biz har safar  

public static final String serverUrl = "...";

deb yozib o’tirmaymiz. 

 

Xulosa

Bu mavzuda hali yana ancha gaplashish mumkin, bugun sizlar bilan  ko’plab  uchraydigan  holatlarni ko’rdik. Agar yuqoridagi xatoliklarni takrorlashni istamasangiz, BARCHA kelgusi yaratadigan dasturlaringizda ushbu tartibda kodlashni boshlang chunki bugun bo’lmasa ertaga siz arzimagan 1-2 daqiqa deb 1-2 kun ketgazishingiz mumkin. Ehtiyotkorlik hech qachon ortiqchalik qilmaydi, ayniqsa dasturlash sohasida, Happy Coding. (~˘▾˘)~