JavaRush /Блоги Java /Random-TG /Кофе-брейк №87. Чаро санҷиши воҳид барои таҳиягарон муҳим...

Кофе-брейк №87. Чаро санҷиши воҳид барои таҳиягарон муҳим аст? 5 Роҳҳои нусхабардории массив дар Java

Дар гурӯҳ нашр шудааст

Чаро санҷиши воҳид барои таҳиягарон муҳим аст?

Сарчашма: SearchSoftwareQuality Биёед муҳокима кунем, ки чаро санҷиши воҳидҳо муҳим ва арзишманд аст ва чӣ гуна он ислоҳи ислоҳро осон мекунад. Санҷиши воҳидҳо воситаи пурқувват барои беҳтар кардани сифати нармафзор мебошад. Санҷишҳои воҳидҳо тасдиқи асосиро таъмин мекунанд, ки барнома ба мушаххасоти нармафзор мувофиқат мекунад ва мувофиқи он рафтор мекунад. Кофе-брейк №87.  Чаро санҷиши воҳид барои таҳиягарон муҳим аст?  5 Роҳҳои нусхабардории массив дар Java - 1Вақте ки хуб анҷом дода мешавад, санҷишҳои воҳидҳо:
  • кам кардани нуксонхо ва муайян кардани онхо дар мархалахои ибтидоии давраи хаёти инкишоф;
  • беҳтар кардани хондани code;
  • иҷозати истифодаи такрории code;
  • суръати пахнкуниро зиёд кунед.
Биёед бубинем, ки чаро санҷиши воҳид муҳим аст, ин навъи санҷиш чӣ гуна ба вуҷуд омадааст ва монеаҳо барои татбиқи он чӣ гунаанд.

Таърихи санҷиши воҳидҳо

Хатогие, ки дар марҳилаи аввал ошкор шудааст, вақт ва кӯшишро сарфа мекунад. Дар тӯли 50 соли аввали таърихи компютер, санҷиши воҳидҳо ва ислоҳи хатогӣ аслан як чиз буданд. Аммо дар солҳои 1990-ум, code чунон мураккаб гашт, ки аксар вақт тақсим кардани система ба қисмҳои хурд имконнопазир буд, то онҳо дар алоҳидагӣ кор кунанд. Дар соли 1997, барномасоз бо номи Кент Бек JUnit, плагини муҳити рушдро барои санҷиши қисмҳои хурди code сохт. Рамзи санҷиш, ки рамзи сарчашмаро арзёбӣ мекунад, санҷишҳои воҳид номида мешаванд. Ин навъи санҷиши воҳидҳо дар тӯли солҳои зиёд ба як чизи асосӣ табдил ёфтааст. Пас аз он ки Бек JUnit-ро таъсис дод, Мартин Фаулер китоби «Рефакторинг»-ро навишт, ки дар он ӯ роҳҳои табдил додани codeро пешниҳод кард, то он бештар ҷудошуда ва санҷида шавад. Маҷмӯи рефакторинги code ва санҷиши воҳидҳо ба рушди ба санҷиш асосёфта оварда расонд, ки дар он эҷоди санҷишҳои воҳидҳо барои раванди барномасозӣ муҳим аст. Дар он, code бояд ҳатто пеш аз сохтани он санҷида шавад. Ҳамин тариқ, раванди барномасозӣ то он даме, ки санҷишҳои воҳид иҷро карда шаванд, анҷом дода намешавад. Пас аз он лоиҳа метавонад ба марҳилаи тадқиқоти сатҳи система ё сатҳи инсонӣ гузарад.

Намунаи санҷиши воҳид

Ин мисол аҳамияти санҷиши воҳидро нишон медиҳад. Дар ин ҷо JUnit функсияи оддиеро арзёбӣ мекунад, ки ҳароратро аз Фаренгейт ба Цельсий табдил медиҳад. Формулаи табдил: C = (F-32) * 5/9. Танҳо чанд сатр, аз ҷумла имзои функсия ва қавсҳои ҷингила, метавонанд дар code ҳамчун вазифаи китобхона амалӣ карда шаванд. Аммо, аз функсия маълум нест, ки ин меъёрҳо мебошанд. Ин интихобҳо метавонанд яклухткунии боло ё поён, рақамҳои воқеӣ ё ҳудуди боло ва поёниро дар бар гиранд. Биёед бо истифода аз модули Test:: More санҷишҳои воҳиди намунавӣ барои ин функсияи табдor ҳароратро дар Perl эҷод кунем. Сатри аввал шарҳест, ки ба барномасоз мегӯяд, ки аз рамзи боқимонда чиро интизор аст.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
Чаҳорчӯбаи JUnit ба системаҳои ба an object нигаронидашуда ва an objectҳои санҷишӣ такя мекунад, аммо консепсия шабеҳ аст.

Санҷишҳои воҳиди ҷудошуда

Яке аз бартариҳои санҷишҳои воҳидҳо дар он аст, ки онҳо функсия, синф ё усулро ҷудо мекунанд ва танҳо он порчаи codeро месанҷанд. Ҷузъҳои беҳтари инфиродӣ устувории умумии системаро таъмин мекунанд. Бо ин роҳ шумо рамзи боэътимод мегиред. Санҷишҳои воҳидҳо инчунин хусусияти раванди ислоҳро тағир медиҳанд. Барои ислоҳи хатогиҳо, барномасозон танҳо як санҷиши ноком менависанд ва сипас онро такрор мекунанд, то он бе вайрон кардани интизориҳои қаблӣ мегузарад. Ин раванд сикли дастии ислоҳи анъанавиро тавассути насб, дубора эҷод, таваққуф ва озмоиш нест мекунад. Барои тағир додани code барои мувофиқ кардани он барои санҷиши воҳид, барномасозон бояд тарзи кори худро тағир диҳанд. Ҳама порчаҳои codeе, ки бидуни санҷишҳои воҳид навишта шудаанд, эҳтимолан ҳадди аққал ҳамчун модулҳои инфиродӣ санҷидашуда ҳисобида мешаванд.

Санҷишҳои мутобиқсозӣ

Нармафзори кӯҳна нармафзорест, ки муддати тӯлонӣ кор мекунад ва эҳтимолан бидуни санҷиши воҳидҳо навишта шудааст. Рамзи меросӣ барои ширкат арзиш дорад. Он солхои зиёд муътадил кор мекунад. Баъзе барномаҳое, ки бидуни санҷиши воҳид сохта шудаанд, дар як рӯз транзаксияҳои миллион долларро коркард мекунанд. Аммо codeе, ки санҷишҳои воҳидиро надорад, бо мурури замон ба як тӯби бузурги лой табдил меёбад, зеро дар тӯли солҳо ба он бисёр барномасозони нигоҳубини code даст задаанд. Рефакторинг ба барномасозон имкон медиҳад, ки тадриҷан ба система тағирот ворид кунанд, то онро санҷида тавонанд. Аммо, ин тағиротҳо вақтро талаб мекунанд. Чанд сол пеш, ман бо ҳамтои худ Боб Реселман масъалаи истифодаи санҷишҳои воҳидҳоро барои барномаҳои кӯҳна муҳокима кардам. Реселман изҳор дошт, ки татбиқи санҷиши воҳидҳо дар замимаҳои бе он сохташуда хеле гарон ва ҳатто аблаҳ аст. Ба ҷои ин, вай ба созмон тавсия дод, ки таҳияи навро бо санҷишҳои воҳид оғоз кунад ва барномаҳои кӯҳнаро танҳо гузорад. Ин метавонад барои COBOL, генераторҳои гузоришҳо ва дигар замимаҳо дуруст бошад, аммо ман баҳс мекардам, ки дар замимаҳои бо забонҳои муосир навишташуда - C++, C#, Java ва Ruby - илова кардани санҷишҳои воҳиди бозгашт хеле осон аст. Ба ҷои навиштани онҳо барои тамоми барнома, танҳо санҷишҳои воҳидиро ба тағироти ҷорӣ ва рефактор ҳангоми рафтан илова кунед.

Баланд бардоштани суръат, сифат ва озмоиш

Менеҷерони лоиҳа мегӯянд, ки банақшагирӣ байни сифат, ҳаҷми корҳои анҷомдодашуда, захираҳо ва вақтро дар бар мегирад. Барои илова кардани чизе ба як минтақа, шумо бояд чизеро аз дигараш дур кунед. Санҷишҳои муассири воҳидҳо ин қоидаро вайрон мекунанд. Аз ин рӯ, санҷиши воҳидҳо барои созмонҳо муҳим ва арзишманд аст. Санҷишҳои хуби воҳид codeи санҷидашавандаро тавлид мекунанд, ки сифатро беҳтар мекунад. Ин code камбудиҳои камтар дорад, ки маънои камтар ислоҳ кардани хатогиҳоро барои зудтар анҷом додани лоиҳа дорад. Вақте ки нармафзор ба хатогиҳо дучор мешавад, санҷишҳои воҳид ислоҳ, ислоҳ ва навиштани codeро суръат мебахшанд. Ва ин тавре рӯй медиҳад, ки эҳтимолияти такрори камбудиҳо ҳангоми баланд бардоштани сифат ва суръати code ба таври назаррас коҳиш меёбад. Гарчанде ки дар таҳияи нармафзор ягон тири ҷодугарӣ вуҷуд надорад, санҷишҳои муассири воҳидҳо метавонанд таҳия, озмоиш ва ҳатто баъзе муҳандисии талаботи функсионалӣ суръат бахшанд.

5 Роҳҳои нусхабардории массив дар Java

Сарчашма: Dev.to Ҳамин тавр, шумо ду массиви A ва B доред ва шумо бояд элементҳоро аз A то B нусхабардорӣ кунед. Хуб, роҳҳои гуногуни иҷрои ин кор дар Java вуҷуд доранд ва ман онҳоро ҳоло ба шумо нишон медиҳам.

Усули якум: ForLoop

Ин аст, ки дар он ҷо барои ҳалқаи кӯҳна ба кӯмаки мо меояд :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

Усули дуюм: .clone()

Усули клонкунии массив инчунин метавонад барои ба даст овардани натиҷаи дилхоҳ кӯмак расонад:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

Усули сеюм: System.arraycopy()

Роҳи дигар ин истифодаи усули System.arraycopy() аст , ки дар бастаи java.lang ҷойгир аст . Пеш аз он ки мо ба истифодаи он гузарем, биёед имзои онро муҳокима кунем:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
Ариза:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

Усули чор: Arrays.copyOf()

Варианти навбатии нусхабардорӣ, ки мо муҳокима хоҳем кард, синфи Arrays аз пакети java.utils мебошад . Ба имзои ӯ диққат диҳед:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
Ариза:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

Усули панҷум: Arrays.copyOfRange()

Ҳамин тавр, ин охирин вариант хоҳад буд, ки мо дар ин мақола дида мебароем. Он инчунин аз синфи Arrays дар бастаи java.utils мавҷуд аст . Биёед бори дигар ба имзои ӯ назар андозем:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
Ариза:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION