JavaRush /Блоги Java /Random-TG /Тағйирёбандаҳои глобалӣ дар Java: Кай онҳоро истифода бур...
Анзор Кармов
Сатҳи
Санкт-Петербург

Тағйирёбандаҳои глобалӣ дар Java: Кай онҳоро истифода бурдан мумкин аст?

Дар гурӯҳ нашр шудааст
Салом! Дар ин мақола мо дар бораи тағирёбандаҳои глобалӣ, эъломияи онҳо ва мисолҳои истифодаи мувофиқ сӯҳбат хоҳем кард. Як ёддошти хурд: мо тағирёбандаҳои синфи глобалиро баррасӣ намекунем, яъне онҳоеро, ки дар дохor ягон синф дастрас кардан мумкин аст. Мо дар бораи тағирёбандаҳои глобалии тамоми барнома сӯҳбат хоҳем кард - онҳое, ки метавонанд дар дохor тамоми барнома дастрас бошанд. Тағйирёбандаҳои глобалӣ дар Java: Кай онҳоро истифода бурдан мумкин аст?  - 1

Чӣ гуна тағирёбандаҳои глобалиро эҷод кардан мумкин аст

Тағирёбандаҳои глобалӣ тағирёбандаҳое мебошанд, ки аз ҳама ҷо дар барнома дастрасанд. Ба ибораи дигар, доираи онҳо тамоми барнома аст. Барои эҷод кардани чунин тағирёбанда дар Java, шумо бояд тағирёбандаи статикии оммавиро дар синфи ҷамъиятӣ эҷод кунед:
public class Example {
    public static int a;
    public static int b;
    public static String str;
}
Тағирёбандаҳои a, bва str- глобалӣ шудаанд. Мо метавонем ба онҳо мустақиман аз синфҳои дигар дар дохor барнома дастрасӣ пайдо кунем:
public class GlobalVarsDemo {
    public static void main(String[] args) {
        Example.a = 4;
        Example.b = 5;
        Example.str = "Global String variable value";

        System.out.println(Example.a);
        System.out.println(Example.b);
        System.out.println(Example.str);
    }
}
Агар мо методро иҷро кунем main, мо натиҷаи зеринро мебинем:

4
5
Global String variable value
Тағирёбандаҳои глобалиро ба 2 намуд тақсим кардан мумкин аст:
  • тағирёбандаҳое, ки метавонанд таҳрир карда шаванд;
  • тағирёбандаҳое, ки танҳо хонда метавонанд.
Охиринро константаҳои глобалӣ меноманд. Барои сохтани доимии глобалӣ, шумо бояд тағирёбанда созед finalва ҳангоми муайян кардани тағирёбанда ба он арзиш таъин кунед:
public class Constants {

    public static final double PI = 3.1415926535897932384626433832795;
    public static final String HELLO_WORLD_STR = "Hello, World!";

}
Тибқи конвенсияи номгузории Java, ҳама доимӣ бояд бо ҳарфи калон ном бурда шаванд ва калимаҳоро бо аломати зерхат ҷудо кунанд. Ҳамин тавр, мо константаҳоро эҷод кардем ва ҳоло мо арзишҳои онҳоро тағир дода наметавонем: Тағйирёбандаҳои глобалӣ дар Java: Кай онҳоро истифода бурдан мумкин аст?  - 2Аммо, мо метавонем арзишҳои онҳоро хонем:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(Constants.HELLO_WORLD_STR);
    }
}
Хулоса:

Hello, World!
public class ConstantsDemo {
    public static void main(String[] args) {
        double r = 10;
        String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
        System.out.println(message);

    }

    static double getCircleSquare(double r) {
        return Constants.PI * r * r;
    }
}
Хулоса:

Площадь круга с радиусом 10,000000=314,159265

Оё шумо бояд тағирёбандаҳои глобалиро истифода баред?

Дар Интернет мақолаҳои зиёде мавҷуданд, ки паёми асосии онҳо ин аст: тағирёбандаҳои глобалӣ бад, бад ва даҳшатнок мебошанд. Оё воқеан? Биёед кӯшиш кунем, ки мусбат ва манфии тағирёбандаҳои глобалиро пешниҳод кунем, то ҳар кас хулосаи худро барорад. Тағйирёбандаҳои глобалӣ дар Java: Кай онҳоро истифода бурдан мумкин аст?  - 3Биёед бо манфиҳо оғоз кунем. Биёед як барномаеро тасаввур кунем, ки дорои синф бо тағирёбандаҳои глобалӣ мебошад, ки хондан ва таҳрир кардан мумкин аст. Бо мурури замон шумораи синфҳо дар лоиҳа, шумораи тағирёбандаҳои глобалӣ ва усулҳое, ки тағирёбандаҳои глобалиро истифода мебаранд, ё ба ибораи дигар, ба онҳо вобастаанд, меафзояд. Бо мурури замон, ҳар як тағирёбандаи глобалӣ дар қисмҳои гуногуни система бо мақсадҳои гуногун хонда мешавад. Арзиши тағирёбанда метавонад дар қисмҳои гуногуни система нав карда шавад. Тасвири умумии ҷаҳони ин барнома ба таври назаррас мураккабтар мешавад ва ин боиси нуқсонҳои зерин мегардад :
  1. Коҳиши хониш коҳиш ёфт ва мушкorи дарк кардани code зиёд шуд.
  2. Мушкorи афзояндаи нигоҳдории code.
  3. Барои тағир додани як тағирёбандаи глобалӣ, тамоми codeро таҳлил кардан лозим аст, то тағирёбанда ба қимати барои қисмҳои дигари система беэътибор гузошта нашавад.
  4. Афзоиши хатогиҳое, ки ислоҳи онҳо хеле душвор аст.

    Биёед як тағирёбандаи глобалӣ, массиви an objectҳоро тасаввур кунем. Дар як қисми система, масалан, сатрҳо дар ин массив интизоранд ва дар қисми дигари система касе тасмим гирифт, ки рақамҳои нуқтаи шинокунандаро истифода барад. Аз эҳтимол дур нест, ки касе инро фаҳмидан мехоҳад.

  5. Номҳои тағирёбанда метавонанд якхела бошанд, агар шумо дар codeи худ тағирёбандаҳои глобалиро истифода баред, инчунин баъзе китобхонаҳое, ки дар навбати худ тағирёбандаҳои глобалиро истифода мебаранд. Ин метавонад ба хатогиҳо ҳам дар паҳлӯи замимаи шумо ва ҳам дар паҳлӯи китобхонае, ки шумо истифода мекунед, оварда расонад.
  6. Пайвастшавиро байни қисмҳои гуногуни система, ки тағирёбандаҳои глобалиро истифода мебаранд, афзоиш медиҳад. Баръакс, шумо бояд барои пайвастани фуҷури code кӯшиш кунед. Беҳтар аст, ки бисёр зерсистемаҳои хурд бо ҳам ба таври озод пайваст бошанд, аз он ки як чизи вазнин дошта бошед. Зеро барои майна кор кардан бо якчанд чизҳои оддӣ назар ба як чизи хеле мураккаб ва печида осонтар аст.
  7. Навиштани санҷишҳои воҳидҳо душвортар мешавад, зеро санҷиш намедонад, ки кадом тағирёбандаҳои глобалӣ лозиманд ва чӣ гуна онҳо бояд оғоз карда шаванд.
  8. Дар замимаҳои гуногунҷабҳа, истифодаи тағирёбандаҳои глобалӣ аз ҷониби риштаҳои гуногун боиси зиёд шудани хатогиҳое мегардад, ки ислоҳи онҳо душвор аст ва ба афзоиши мураккабии лоиҳа. Аз ин рӯ, зарур аст, ки дастрасӣ ба чунин тағирёбандаҳоро дурусттар танзим намуда, онҳоро бо синхронизатсия ва қулфҳо муҷаҳҳаз созем. Ин метавонад дар оянда ба ноқилҳои кӯтоҳ оварда расонад. Масалан, риштаи А тағирёбандаи X-ро барои кори худ қулф кардааст ва риштаи B тағирёбандаи Y -ро барои кори худ қуфл кардааст ва риштаи А ҳоло ба тағирёбандаи Y ва риштаи B ба тағирёбандаи X ниёз дорад. Дар натиҷа, барнома ях мекунад.
Аммо ин ҳама нодуруст аст. Ин тавсифи хатарҳост, ки эҳтимолияти онҳо бо афзоиши лоиҳа ва афзоиши шумораи тағирёбандаҳои глобалӣ дар он меафзояд. Биёед ба тарафдорон гузарем :
  1. Дар лоиҳаҳои хурд, тағирёбандаҳои глобалӣ чизи соддатарин барои иҷрои лоиҳа мебошанд.
  2. Баъзан тарс аз истифодаи тағирёбандаҳои глобалӣ боиси мураккабии боз ҳам бештар дар лоиҳа мегардад. Сипас барномасозон ба эҷоди синглтонҳо шурӯъ мекунанд ва ба дигар намунаҳои тарроҳӣ муроҷиат мекунанд.
  3. Дар барномасозӣ, шумо аксар вақт бояд ба баъзе арзишҳои тағирнашаванда такя кунед.

    Аз ҳама оқилона навиштани чунин арзишҳо ҳамчун доимӣ аст, зеро танҳо доимӣ кафолат медиҳанд, ки арзиши тағирёбанда бо мурури замон тағир намеёбад. Чунин доимиро хама вакт ( Integer.MAX_VALUE, Integer.MIN_VALUE, Boolean.TRUE, Collections.EMPTY_LISTва г.) ёфтан мумкин аст. Аммо барномасозӣ бо истифодаи китобхонаҳои стандартӣ маҳдуд намешавад. Аксар вақт рӯй медиҳад, ки шумо бояд як навъ мантиқи беназирро нависед, ки ба константаҳои беназири худ такя кардан лозим аст. Аз ин рӯ, баъзан истифодаи доимӣ (тағйирёбандаҳои глобалӣ барои хондан) воқеан ҳаётро осонтар мекунад.

Умуман, шумо набояд тағирёбандаҳои глобалиро аз ҳад зиёд истифода баред; агар имконпазир бошад, танҳо константаҳоро истифода баред. Пештар гуфта шуда буд, ки истифодаи тағирёбандаҳои глобалӣ дар лоиҳаҳои хурд бад нест. Аммо барои як таҳиягари навкор беҳтар аст, ки онҳоро умуман истифода набарад. Бо ду сабаб:
  1. Ҳар чизе ки як таҳиягари навкор менависад, аслан як лоиҳаи хурд аст. Ва истифодаи тағирёбандаҳои глобалӣ дар лоиҳаҳои худ ба ӯ таълим медиҳад, ки тағирёбандаҳои глобалиро дар ҳама ҷо истифода баранд.
  2. Беҳтар аст, ки аввал бе "ҳилаи мамнӯъ" кор карданро ёд гиред. Ва бо таҷриба, фаҳмидани он, ки кай истифодаи ин гуна усулҳо мувофиқ аст, худ аз худ пайдо мешавад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION