JavaRush /Блоги Java /Random-TG /Дастур оид ба услуби умумии барномасозӣ
pandaFromMinsk
Сатҳи
Минск

Дастур оид ба услуби умумии барномасозӣ

Дар гурӯҳ нашр шудааст
Ин мақола як қисми курси академии "Advanced Java" мебошад. Ин курс барои омӯхтани тарзи самаранок истифода бурдани хусусиятҳои Java пешбинӣ шудааст. Мавод мавзӯҳои "пешрафта" ба монанди эҷоди an object, рақобат, силсиласозӣ, инъикос ва ғайраро дар бар мегирад. Курс ба шумо тарзи самаранок азхуд кардани усулҳои Java-ро меомӯзад. Тафсилот дар ин ҷо .
Мундариҷа
1. Муқаддима 2. Доираи тағирёбанда 3. Майдонҳои синф ва тағирёбандаҳои маҳаллӣ 4. Аргументҳои методӣ ва тағирёбандаҳои маҳаллӣ 5. Бокс ва кушодан 6. Интерфейсҳо 7. Сатрҳо 8. Конвенсияҳои номгузорӣ 9. Китобхонаҳои стандартӣ 10. Тағирнопазирӣ 11. Санҷишҳои навбатӣ 12. .. 13. Рамзи сарчашмаро зеркашӣ кунед
1. Муқаддима
Дар ин қисми дарс мо муҳокимаи худро дар бораи принсипҳои умумии услуби хуби барномасозӣ ва тарҳрезии ҷавобгӯ дар Java идома медиҳем. Мо аллакай баъзе аз ин принсипҳоро дар бобҳои қаблии дастур дидаем, аммо бо мақсади баланд бардоштани маҳорати таҳиягари Java бисёр маслиҳатҳои амалӣ дода мешаванд.
2. Доираи тағйирёбанда
Дар Қисми сеюм («Чӣ тавр тарҳрезии синфҳо ва интерфейсҳо») мо муҳокима кардем, ки чӣ гуна аёният ва дастрасиро ба аъзоёни синфҳо ва интерфейсҳо бо назардошти маҳдудиятҳои миқёс татбиқ кардан мумкин аст. Аммо, мо то ҳол тағирёбандаҳои маҳаллиро, ки дар татбиқи усул истифода мешаванд, муҳокима накардаем. Дар забони Java, ҳар як тағирёбандаи маҳаллӣ, ки як бор эълон карда мешавад, доираи дорад. Ин тағирёбанда аз ҷойе, ки эълон шудааст, то ба анҷом расидани иҷрои метод (ё блоки code) намоён мешавад. Умуман, ягона қоидае, ки бояд риоя шавад, эълон кардани тағирёбандаи маҳаллӣ ба қадри имкон ба маконе, ки он истифода мешавад, наздик аст. Биёед ман як мисоли маъмулиро бубинам: for( final Locale locale: Locale.getAvailableLocales() ) { // блок codeа } try( final InputStream in = new FileInputStream( "file.txt" ) ) { // блока codeа } Дар ҳарду порчаҳои code, доираи тағирёбандаҳо бо блокҳои иҷрошаванда, ки ин тағирёбандаҳо эълон карда мешаванд, маҳдуд аст. Вақте ки блок ба итмом мерасад, миқёс ба охир мерасад ва тағирёбанда ноаён мегардад. Ин равшантар ба назар мерасад, аммо бо нашри Java 8 ва ҷорӣ кардани ламбдаҳо, бисёре аз идиомаҳои маъруфи забон бо истифода аз тағирёбандаҳои маҳаллӣ кӯҳна мешаванд. Иҷозат диҳед аз мисоли қаблӣ бо истифода аз lambdas ба ҷои ҳалқа мисол орам: Arrays.stream( Locale.getAvailableLocales() ).forEach( ( locale ) -> { // блок codeа } ); Мумкин аст, ки тағирёбандаи маҳаллӣ як аргументи функсия шудааст, ки дар навбати худ ҳамчун аргумент ба усули forEach интиқол дода мешавад .
3. Майдонҳои синф ва тағирёбандаҳои маҳаллӣ
Ҳар як усул дар Java ба синфи мушаххас тааллуқ дорад (ё дар мавриди Java8, интерфейсе, ки дар он усул ҳамчун усули пешфарз эълон карда мешавад). Байни тағирёбандаҳои маҳаллӣ, ки майдонҳои синф ё усулҳое мебошанд, ки дар татбиқ истифода мешаванд, эҳтимолияти ихтилофи ном вуҷуд дорад. Тартибдиҳандаи Java медонад, ки чӣ гуна тағирёбандаи дурустро аз байни мавҷуда интихоб кунад, гарчанде ки зиёда аз як таҳиякунанда нияти истифодаи ин тағирёбандаро доранд. IDE-ҳои муосири Java кори бузургеро иҷро мекунанд, ки ба таҳиякунанда ҳангоми рух додани чунин низоъҳо тавассути огоҳиҳои компилятор ва равшансозии тағирёбанда хабар медиҳанд. Аммо беҳтар аст, ки ҳангоми навиштани code дар бораи ин чизҳо фикр кунед. Ман тавсия медиҳам, ки мисолро дида бароем: public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += value; return value; } } Мисол хеле осон менамояд, аммо ин дом аст. Усули accountValue арзиши тағирёбандаи маҳаллиро ҷорӣ мекунад ва дар он кор карда, майдони синфро бо ҳамон ном пинҳон мекунад. Сатр value += value; бояд маҷмӯи арзиши майдони синф ва тағирёбандаи маҳаллӣ бошад, аммо ба ҷои ин, чизи дигаре анҷом дода мешавад. Татбиқи дуруст чунин хоҳад буд (бо истифода аз ин калимаи калидӣ): public class LocalVariableAndClassMember { private long value; public long calculateValue( final long initial ) { long value = initial; value *= 10; value += this.value; return value; } } Гарчанде ки ин мисол аз баъзе ҷиҳат соддалавҳона аст, он як нуктаи муҳимро нишон медиҳад, ки дар баъзе мавридҳо барои ислоҳ ва ислоҳи он соатҳо лозим аст.
4. Аргументҳои методӣ ва тағирёбандаҳои маҳаллӣ
Боз як доме, ки таҳиягарони бетаҷрибаи Java аксар вақт ба он дучор мешаванд, истифодаи далелҳои методӣ ҳамчун тағирёбандаҳои маҳаллӣ мебошад. Java ба шумо имкон медиҳад, ки арзишҳоро ба аргументҳои доимӣ аз нав таъин кунед (аммо ин ба арзиши аслӣ таъсир намерасонад): public String sanitize( String str ) { if( !str.isEmpty() ) { str = str.trim(); } str = str.toLowerCase(); return str; } Парчами code дар боло шево нест, аммо он кори хубе барои ошкор кардани мушкилот мекунад: аргументи str таъин шудааст. арзиши дигар (ва асосан ҳамчун тағирёбандаи маҳаллӣ истифода мешавад) . Дар ҳама ҳолатҳо (бе ягон истисно), шумо метавонед ва бояд бе ин мисол кор кунед (масалан, тавассути эълон кардани аргументҳо ҳамчун доимӣ). Масалан: public String sanitize( final String str ) { String sanitized = str; if( !str.isEmpty() ) { sanitized = str.trim(); } sanitized = sanitized.toLowerCase(); return sanitized; } Бо риояи ин қоидаи оддӣ, пайгирӣ кардани рамзи додашуда ва пайдо кардани сарчашмаи мушкилот ҳатто ҳангоми ворид кардани тағирёбандаҳои маҳаллӣ осонтар аст.
5. Бастан ва кушодан
Бокс ва кушодан номи усулест, ки дар Java барои табдил додани намудҳои ибтидоӣ ( int, long, double ва ғайра ) ба парпечҳои навъи мувофиқ ( Integer, Long, Double ва ғайра) истифода мешавад. Дар қисми 4-и дастури чӣ гуна ва кай истифода бурдани Generics, шумо аллакай инро дар амал дидаед, вақте ки ман дар бораи печонидани намудҳои ибтидоӣ ҳамчун параметрҳои навъи генерикҳо сӯҳбат кардам. Ҳарчанд компилятори Java кӯшиш мекунад, ки чунин табдилҳоро тавассути иҷрои autoboxing пинҳон кунад, баъзан ин аз интизорӣ камтар аст ва натиҷаҳои ғайричашмдошт меорад. Биёед як мисолро бубинем: public static void calculate( final long value ) { // блок codeа } final Long value = null; calculate( value ); Парчами codeи боло хуб тартиб медиҳад. Бо вуҷуди ин, он NullPointerException -ро дар хате мепартояд , ки он байни Long ва long // блок табдил меёбад . Маслиҳат барои чунин ҳолат ин аст, ки истифодаи намудҳои ибтидоӣ тавсия дода мешавад (аммо, мо аллакай медонем, ки ин на ҳамеша имконпазир аст).
6. Интерфейсҳо
Дар қисми 3-и дастури "Чӣ тавр тарҳрезии синфҳо ва интерфейсҳо" мо интерфейсҳо ва барномасозии шартномавиро баррасӣ карда, таъкид кардем, ки то ҳадди имкон интерфейсҳо бояд аз синфҳои мушаххас бартарӣ дода шаванд. Мақсади ин бахш аз он иборат аст, ки шуморо ташвиқ кунед, ки аввал интерфейсҳоро бо нишон додани ин бо мисолҳои воқеии ҷаҳонӣ баррасӣ кунед. Интерфейсҳо ба татбиқи мушаххас алоқаманд нестанд (ба истиснои усулҳои пешфарз). Онҳо танҳо шартномаҳо мебошанд ва ҳамчун намуна, онҳо озодӣ ва чандирии зиёдеро дар роҳи иҷрои шартномаҳо таъмин мекунанд. Ин чандирӣ вақте муҳимтар мешавад, ки татбиқ системаҳо ё хидматҳои берунаро дар бар мегирад. Биёед мисоли интерфейси оддӣ ва татбиқи имконпазири онро дида бароем: public interface TimezoneService { TimeZone getTimeZone( final double lat, final double lon ) throws IOException; } public class TimezoneServiceImpl implements TimezoneService { @Override public TimeZone getTimeZone(final double lat, final double lon) throws IOException { final URL url = new URL( String.format( "http://api.geonames.org/timezone?lat=%.2f&lng=%.2f&username=demo", lat, lon ) ); final HttpURLConnection connection = ( HttpURLConnection )url.openConnection(); connection.setRequestMethod( "GET" ); connection.setConnectTimeout( 1000 ); connection.setReadTimeout( 1000 ); connection.connect(); int status = connection.getResponseCode(); if (status == 200) { // Do something here } return TimeZone.getDefault(); } } Дар пораи codeи боло намунаи маъмулии интерфейс ва татбиқи он нишон дода шудааст. Ин татбиқ хидмати берунии HTTP ( http://api.geonames.org/ ) барои дарёфти минтақаи вақти макони мушаххасро истифода мебарад. Аммо, зеро шартнома аз интерфейс вобаста аст, хеле осон аст, ки татбиқи дигари интерфейс бо истифода аз, масалан, пойгоҳи додаҳо ё ҳатто як файли ҳамвор муқаррарӣ. Бо онҳо, интерфейсҳо дар тарҳрезии codeи санҷишшаванда хеле муфиданд. Масалан, занг задан ба хидматҳои беруна дар ҳар як санҷиш на ҳамеша амалӣ аст, бинобар ин, ба ҷои он татбиқи алтернативӣ ва соддатаринро (масалан, ноустувор) амалӣ кардан маъно дорад: public class TimezoneServiceTestImpl implements TimezoneService { @Override public TimeZone getTimeZone(final double lat, final double lon) throws IOException { return TimeZone.getDefault(); } } Ин амалияро дар ҳама ҷое истифода бурдан мумкин аст, ки интерфейси TimezoneService лозим аст. скрипти санҷиш аз вобастагӣ аз ҷузъҳои беруна. Бисёр намунаҳои беҳтарини истифодаи самараноки чунин интерфейсҳо дар китобхонаи стандартии Java фаро гирифта шудаанд. Коллексияҳо, рӯйхатҳо, маҷмӯаҳо - ин интерфейсҳо дорои якчанд амалисозӣ мебошанд, ки метавонанд ба таври бефосила иваз карда шаванд ва ҳангоми истифодаи шартномаҳо метавонанд иваз карда шаванд. Барои намуна: public static< T > void print( final Collection< T > collection ) { for( final T element: collection ) { System.out.println( element ); } } print( new HashSet< Object >( /* ... */ ) ); print( new ArrayList< Integer >( /* ... */ ) ); print( new TreeSet< String >( /* ... */ ) );
7. Сатрҳо
Сатрҳо яке аз навъҳои маъмултарин дар ҳам Java ва ҳам дар забонҳои дигари барномасозӣ мебошанд. Забони Java бисёр коркарди сатрҳои муқаррариро тавассути дастгирии амалиёти пайвастшавӣ ва муқоисавӣ аз қуттӣ содда мекунад. Илова бар ин, китобхонаи стандартӣ синфҳои зиёдеро дар бар мегирад, ки амалиёти сатрро самаранок мекунанд. Ин маҳз ҳамон чизест, ки мо дар ин бахш муҳокима хоҳем кард. Дар Java сатрҳо an objectҳои тағирнашаванда мебошанд, ки дар рамзгузории UTF-16 муаррифӣ шудаанд. Ҳар дафъае, ки шумо сатрҳоро пайваст мекунед (ё ягон амалеро иҷро мекунед, ки сатри аслиро тағир медиҳад), намунаи нави синфи String эҷод мешавад . Аз ин сабаб, амалиёти пайвастшавӣ метавонад хеле бесамар гардад, ки боиси эҷоди бисёр мисолҳои фосилавии синфи String мегардад (ба таври умум ахлот эҷод мекунад). Аммо китобхонаи стандартии Java дорои ду синфи хеле муфид аст, ки ҳадафашон қулай кардани коркарди сатр аст. Инҳо StringBuilder ва StringBuffer мебошанд (ягона фарқияти байни онҳо дар он аст, ки StringBuffer ришта бехатар аст, дар ҳоле ки StringBuilder баръакс аст). Биёед якчанд мисоли истифодашавандаи яке аз ин синфҳоро дида бароем: final StringBuilder sb = new StringBuilder(); for( int i = 1; i <= 10; ++i ) { sb.append( " " ); sb.append( i ); } sb.deleteCharAt( 0 ); sb.insert( 0, "[" ); sb.replace( sb.length() - 3, sb.length(), "]" ); Ҳангоми истифодаи StringBuilder/StringBuffer роҳи тавсияшудаи коркарди сатрҳост, он метавонад дар соддатарин сенарияи пайвастани ду ё се сатр аз ҳад зиёд ба назар расад, то оператори иловагии муқаррарӣ ( ("+"), масалан: String userId = "user:" + new Random().nextInt( 100 ); Аксар вақт беҳтарин алтернатива барои соддагардонии пайвастшавӣ ин истифодаи форматкунии сатр ва инчунин Китобхонаи стандартии Java мебошад, ки барои таъмин кардани усули статикии String.format кӯмак мерасонад . Ин маҷмӯи ғании мушаххаскунандагони формат, аз ҷумла рақамҳо, рамзҳо, сана/вақт ва ғайраро дастгирӣ мекунад. (Барои тафсилоти пурра ба ҳуҷҷатҳои истинодӣ муроҷиат кунед) Усули String.format( "%04d", 1 ); -> 0001 String.format( "%.2f", 12.324234d ); -> 12.32 String.format( "%tR", new Date() ); -> 21:11 String.format( "%tF", new Date() ); -> 2014-11-11 String.format( "%d%%", 12 ); -> 12% String.format равиши тоза ва сабукро барои тавлиди сатрҳо аз намудҳои гуногуни додаҳо таъмин мекунад. Қобor зикр аст, ки IDE-ҳои муосири Java метавонанд мушаххасоти форматро аз аргументҳои ба усули String.format интиқолшуда таҳлил кунанд ва дар сурати ошкор шудани ягон номувофиқатӣ таҳиягаронро огоҳ кунанд.
8. Конвенсияҳои номгузорӣ
Java забонест, ки таҳиягаронро маҷбур намекунад, ки ҳама гуна конвенсияи номгузориро риоя кунанд, аммо ҷомеа маҷмӯи қоидаҳои оддиеро таҳия кардааст, ки codeи Java-ро ҳам дар китобхонаи стандартӣ ва ҳам дар ҳама лоиҳаҳои дигари Java мувофиқ мегардонанд:
  • номҳои бастаҳо бо ҳарфҳои хурд навишта мешаванд: org.junit, com.fasterxml.jackson, javax.json
  • номҳои синфҳо, рӯйхатҳо, интерфейсҳо, эзоҳҳо бо ҳарфи калон навишта мешаванд: StringBuilder, Runnable, @Override
  • Номи майдонҳо ё усулҳо (ба истиснои ниҳоии статикӣ ) дар қайди шутур нишон дода шудаанд: isEmpty, format, addAll
  • майдони ниҳоии статикӣ ё номҳои доимии шумора бо ҳарфи калон, бо зерхатти ("_") ҷудо карда шудаанд: LOG, MIN_RADIX, INSTANCE.
  • тағирёбандаҳои маҳаллӣ ё аргументҳои методӣ бо аломати шутур ворид карда мешаванд: str, newLength, minimumCapacity
  • Номҳои навъи параметрҳо барои генерикҳо бо як ҳарф бо ҳарфи калон ифода карда мешаванд: T, U, E
Бо риояи ин конвенсияҳои оддӣ, рамзи навиштани шумо мухтасар ва услубӣ аз китобхона ё чаҳорчӯбаи дигар ба назар мерасад ва эҳсос хоҳад кард, ки он аз ҷониби ҳамон шахс таҳия шудааст (яке аз он вақтҳои нодире, ки конвенсияҳо воқеан кор мекунанд).
9. Китобхонаҳои стандартӣ
Новобаста аз он ки шумо дар кадом намуди лоиҳаи Java кор мекунед, китобхонаҳои стандартии Java дӯстони беҳтарини шумо мебошанд. Бале, бо он розӣ шудан душвор аст, ки онҳо баъзе кунҷҳои ноҳамвор ва қарорҳои аҷиби тарроҳӣ доранд, аммо 99% вақт ин рамзи баландсифати аз ҷониби коршиносон навишташуда мебошад. Инро омӯхтан лозим аст. Ҳар як нашри Java ба китобхонаҳои мавҷуда бисёр хусусиятҳои нав меорад (бо баъзе мушкилоти эҳтимолӣ бо хусусиятҳои кӯҳна) ва инчунин бисёр китобхонаҳои навро илова мекунад. Java 5 китобхонаи нави ҳамзамонро ҳамчун як қисми бастаи java.util.concurrent овард . Java 6 дастгирии скриптро (камтар маълум) ( бастаи javax.script ) ва API- и компилятори Java (ҳамчун қисми бастаи javax.tools ) муаррифӣ кард. Java 7 ба java.util.concurrent беҳбудиҳои зиёде овард , ки китобхонаи нави I/O-ро дар бастаи java.nio.file ва дастгирии забонҳои динамикӣ дар java.lang.invoke ҷорӣ кард . Ва ниҳоят, Java 8 сана/вақти деринтизорро дар пакети java.time илова кард . Java ҳамчун платформа дар ҳоли рушд аст ва барои пешравии он дар баробари тағйироти дар боло зикршуда хеле муҳим аст. Ҳар вақте, ки шумо дар бораи дохил кардани китобхона ё чаҳорчӯбаи тарафи сеюм ба лоиҳаи худ фикр мекунед, боварӣ ҳосил кунед, ки функсияҳои зарурӣ аллакай дар китобхонаҳои стандартии Java мавҷуд нестанд (албатта, бисёр амалҳои махсус ва сермахсули алгоритмҳо мавҷуданд, ки аз онҳо пештаранд. алгоритмҳо дар китобхонаҳои стандартӣ, аммо дар аксари ҳолатҳо онҳо воқеан лозим нестанд).
10. Тағирнопазирӣ
Тағйирнопазирӣ дар тамоми дастур ва дар ин қисм ҳамчун хотиррасон боқӣ мемонад: лутфан онро ҷиддӣ қабул кунед. Агар синфе, ки шумо тарҳрезӣ мекунед ё усуле, ки шумо татбиқ мекунед, метавонад кафолати тағирнопазириро таъмин кунад, онро дар аксари ҳолатҳо бидуни тарси тағир додани ҳамзамон истифода бурдан мумкин аст. Ин ҳаёти шуморо ҳамчун таҳиякунанда (ва умедворем, ки ҳаёти аъзоёни дастаи шумо) осонтар мекунад.
11. Санҷиш
Таҷрибаи таҳияи санҷишӣ (TDD) дар ҷомеаи Java бениҳоят маъмул аст ва сатри сифати codeро баланд мекунад. Бо тамоми бартариҳое, ки TDD медиҳад, афсӯс мехӯрам, ки китобхонаи стандартии Java имрӯз ягон чаҳорчӯбаи санҷишӣ ё асбобҳои дастгирӣро дар бар намегирад. Бо вуҷуди ин, санҷиш як ҷузъи зарурии рушди муосири Java шудааст ва дар ин бахш мо якчанд усулҳои асосиро бо истифода аз чаҳорчӯбаи JUnit дида мебароем . Дар JUnit, аслан, ҳар як санҷиш маҷмӯи изҳорот дар бораи ҳолати интизорӣ ё рафтори an object мебошад. Сирри навиштани санҷишҳои олӣ ин аст, ки онҳо содда ва кӯтоҳ нигоҳ дошта, як чизро дар як вақт санҷед. Ҳамчун машқ, биёед маҷмӯи санҷишҳоро нависем, то тафтиш кунем, ки String.format функсия аз бахши сатр аст, ки натиҷаи дилхоҳро бармегардонад. package com.javacodegeeks.advanced.generic; import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.equalTo; import org.junit.Test; public class StringFormatTestCase { @Test public void testNumberFormattingWithLeadingZeros() { final String formatted = String.format( "%04d", 1 ); assertThat( formatted, equalTo( "0001" ) ); } @Test public void testDoubleFormattingWithTwoDecimalPoints() { final String formatted = String.format( "%.2f", 12.324234d ); assertThat( formatted, equalTo( "12.32" ) ); } } Ҳарду санҷишҳо хеле хондашаванда ба назар мерасанд ва иҷрои онҳо мисолҳост. Имрӯз, лоиҳаи миёнаи Java дорои садҳо ҳолатҳои санҷишӣ мебошад, ки ба таҳиягар ҳангоми коркард дар бораи регрессияҳо ё хусусиятҳо фикру мулоҳизаҳои зуд медиҳад.
12. Оянда
Ин қисми дастур як силсила мубоҳисаҳои марбут ба амалияи барномасозӣ дар Java ва дастурҳоро барои ин забони барномасозӣ анҷом медиҳад. Дафъаи дигар мо ба хусусиятҳои забон бармегардем ва ҷаҳони Java-ро дар бораи истисноҳо, намудҳои онҳо, чӣ гуна ва кай истифода бурдани онҳо меомӯзем.
13. Рамзи сарчашмаро зеркашӣ кунед
Ин дарс оид ба принсипҳои умумии рушд аз курси Advanced Java буд. Рамзи ибтидоии дарсро дар ин ҷо зеркашӣ кардан мумкин аст .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION