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.
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:
- Dastur 3xil tilda bo’lishi kerak: Ingliz, Rus va O’zbek
- Dasturning tungi rejimi bo’lishi kerak (Dark mode)
- Dastur planshet yoki katta ekranli telefonlarga moslashtirish kerak.
- 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:
- Loyihani 2-3ta odam kod yozgan bo’lishi mumkin va kim, qayerda bu kodlarni ishlatganligini o’zlari ham bilmasliklari mumkin.
- 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’lumotnistrings.xml
dan olayotganligimizni bildiradi.text_btn
,login_hint
–strings.xml
dagi matnlarningname
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
– bizstrings.xml
faylidagimy_text
nomli matnniid
sini oldik.getString(…)
-R.string.my_text
ga tegishliid
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 .


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.

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 |
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" />
- Darth Vader, The Death Star, +442894630, darth_vader@dark_side.com uchun
<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:
- Avtomobil zavodi – bizning dastur
Nexia 2
– FIO, Address, Tel, E-mail uchun yaratilganTextView
(text_label
deb nomlaymiz)Nexia 3
– Darth Vader, The Death Star, +442894630, darth_vader@dark_side.com uchun yaratilganTextView
(text_value
deb nomlaymiz)- 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. (~˘▾˘)~