Անցում ամսաթվերի միջով՝ օգտագործելով Կոտլինի միջակայքի արտահայտությունները

Որպեսզի շարահյուսությունը ցիկլային կրկնության և վերահսկման հոսքի հայտարարությունների համար անվտանգ և բնական ընթերցման համար դարձնի, Կոտլինի ստանդարտ գրադարանը տրամադրում է տիրույթի հայեցակարգը: Այս գրառման մեջ մենք պատրաստվում ենք ուսումնասիրել, թե ինչպես օգտագործել տիրույթի արտահայտությունները գործողության մեջ: Նախ, մենք պատրաստվում ենք բացահայտել ներկառուցված տիրույթի իրականացում այնպիսի ինտեգրալ տեսակների համար, ինչպիսիք են Char, Int կամ Long: Հաջորդը, մենք պատրաստվում ենք իրականացնել սովորական առաջընթաց LocalDate դասի համար: Եկեք սկսենք 🚀!

Կրկնվող պրիմիտիվ տեսակների միջոցով

Շրջանակի գաղափարն ինքնին կարող է դիտվել որպես վերացական տվյալների տեսակ, որը մոդելավորում է արժեքների փակ շրջանակ կամ օբյեկտների մի շարք, որոնք կարող են կրկնվել հակիրճ ձևով: kotlin.ranges փաթեթից ինտերֆեյսը, որը կոչվում է ClosedRange, բազային հռչակագիր է, որը մոդելավորում է տիրույթի գաղափարը: Այն պահում է բռնիչը տիրույթի առաջին և վերջին տարրերին, ինչպես նաև տրամադրում է contains(value: T): Booleanև isEmpty(): Boolean ֆունկցիաները, որոնք ստուգում են երկու պայման՝ արդյոք տվյալ արժեքը պատկանում է տիրույթին և եթե տիրույթը դատարկ է: Գոյություն ունեն ներկառուցված ընդգրկույթներ ինտեգրալ պարզունակ տեսակների համար, ինչպիսիք են Int, Long և Char: Պարզունակ տիպի միջակայք սահմանելու համար մենք օգտագործում ենք rangeTo() ֆունկցիան: Եկեք նայենք հետևյալ օրինակին 👇🏽.

Վերևի հայտարարությունը սահմանում է 0-ից մինչև 1000 արժեքների ամբողջ թվերի տիրույթ: rangeTo() ֆունկցիան ունի նաև իր սեփական օպերատորը .. համարժեքը, որը թույլ է տալիս ընդգրկույթը հայտարարել ավելի բնական եղանակով 🦊:

Կափարիչի տակ IntRange իրականացումը պարունակում է IntProgressionclass, որն ապահովում է Iterator ինտերֆեյսի իրականացումը, որն անհրաժեշտ է կրկնության համար: Ահա for ցիկլով ամբողջ թվերի առաջընթացն օգտագործելու օրինակ.

Վերը նշված կոդը գործարկելու արդյունքում մենք կստանանք հետևյալ արժեքները, որոնք տպագրվում են վահանակում.

0

100

200

1000

Մենք կարող ենք նաև նույն արդյունքին հասնել՝ իրականացնելով կրկնությունը՝ օգտագործելով while օղակը ավելի հրամայական եղանակով (բայց մենք ապրում ենք 21-րդ դարում և չենք անի 😛):

Անցում ոչ պարզունակ տեսակների միջով

Պարզվում է, որ նաև բավականին հեշտ է իրականացնել մաքսային առաջընթաց ցանկացած տեսակի համար, որն իրականացնում է Comparable ինտերֆեյսը: Այս մասում մենք կուսումնասիրենք, թե ինչպես ստեղծել LocalDate տիպի օբյեկտների առաջընթաց և կբացահայտենք, թե ինչպես կարելի է անցնել ամսաթվերը հեշտ ճանապարհով:

Այս առաջադրանքն իրականացնելու համար, նախ, մենք պետք է ծանոթանանք ClosedRangeև Iterator ինտերֆեյսերին: Մենք պետք է դրանք իրականացնենք, որպեսզի հայտարարենք առաջընթաց LocalDate տեսակի համար:

ClosedRange ինտերֆեյսը բացահայտում է տիրույթի նվազագույն և առավելագույն արժեքները: Այն նաև տրամադրում է contains(value: T): Boolean և isEmpty(): Booleanգործառույթների իրականացումը, որը ստուգում է՝ արդյոք տվյալ արժեքը պատկանում է տիրույթին և արդյոք տիրույթը դատարկ է: Մյուս կողմից, Iteratorինտերֆեյսը պարզապես տեղեկատվություն է տրամադրում հաջորդ արժեքի և դրա հասանելիության մասին՝ հետևյալ կերպ.

Սկսենք Iterator օրինակի ներդրումից LocalDate տեսակի համար: Մենք պատրաստվում ենք ստեղծել մաքսային դաս, որը կոչվում է DateIterator, որն իրականացնում է Iterator<LocalDate> ինտերֆեյսը:

DateIterator դասն ունի 3 հատկություն՝currentDate, endDateInclusiveև stepDays: next() ֆունկցիայի ներսում մենք վերադարձնում ենք currentDate արժեքը և այն թարմացնում ենք ամսաթվի արժեքին՝ օգտագործելով տրված stepDaysհատկության միջակայքը:

Հիմա եկեք առաջ շարժվենք և իրականացնենք առաջընթացը LocalDate տիպի համար: Մենք պատրաստվում ենք ստեղծել նոր դաս, որը կոչվում է DateProgression, որը կիրականացնի Iterable<LocalDate> և ClosedRange<LocalDate>ինտերֆեյսը:

DateProgression դասը միաձուլում է գործառույթները, որոնք հայտարարված են և՛ Iterable<LocalDate>, և՛ ClosedRange<LocalDate> միջերեսներով: Կրկնումը թույլ տալու համար մենք պետք է տրամադրենք DateIterator դասի օրինակ՝ որպես Iterable ինտերֆեյսի պահանջվող Iterator արժեք: Մենք նաև պետք է անտեսենք ClosedRange ինտերֆեյսի start և endInclusive հատկությունները անմիջապես կոնստրուկտորում: Կա նաև stepDays հատկություն՝ նշանակված 1 լռելյայն արժեքով: Ինչպես տեսնում եք, ամեն անգամ, երբ մենք կանչում ենք քայլ ֆունկցիան, ստեղծվում է DateProgression դասի նոր օրինակ:

Վերջին քայլը, որն անհրաժեշտ է LocalDate տեսակը տիրույթի արտահայտման համար օգտագործելու համար, LocalDate դասի համար սովորական rangeTo օպերատորի հայտարարումն է:

վերջ 🎊Այժմ մենք կարող ենք աշխատել LocalDate տիպի հետ՝ օգտագործելով միջակայքի արտահայտությունները: Տեսնենք, թե ինչպես օգտագործել մեր իրականացումը գործողության մեջ: Ստորև բերված օրինակում մենք կօգտագործենք մեր rangeTo օպերատորի հայտարարագիրը՝ կրկնելու համար տրված ամսաթվերի միջակայքը.

Արդյունքում, վերը նշված օրինակի կոդի տողերը կտպեն հաջորդ ամսաթվերը մեկ շաբաթ տևողությամբ, հետևյալ կերպ.

Չորեքշաբթի 2020–01–01

Չորեքշաբթի 2020–01–08

Չորեքշաբթի 2020–12–30

Կա ավելին…

DateProgression դասի իրականացման շնորհիվ մեզ հաջողվել է հասնել LocalDate օրինակների միջոցով կրկնելու արդյունավետ միջոցի: Բայց սա դեռ ամենը չէ: Մեր ներդրումն ապահովում է LocalDate օբյեկտների միջակայքերը օգտագործելու կոկիկ եղանակ՝ հոսքի վերահսկման պայմաններում, ինչպիսիք են.

Kotlin-ի մեկ այլ հզոր հատկանիշ, որը մենք օգտագործել ենք
LocalDate կրկնության օրինակում, օպերատորի գերբեռնման հնարավորությունն է: Այն թույլ է տալիս ֆունկցիաների կանչերը փոխարինել հակիրճ շարահյուսությամբ և օգնում է գրել կոդ, որն ավելի քիչ կաթսա է և միաժամանակ կարդալը բնական է 😀:

Կոտլինը բացատրեց

Kotlin Explained շարքի հոդվածները կենտրոնացած են Կոտլին լեզվի առանձնահատկությունների և հասկացությունների վրա, որոնք ամենօրյա ծրագրավորումն օգտակար են դարձնում:

Կա՞ որևէ կոնկրետ բան, որը կցանկանայիք կարդալ Kotlin Explained շարքում: Գրեք ձեր գաղափարը մեկնաբանություններում և մնացեք հետևում:

Եթե ​​այս հոդվածը ձեզ օգտակար է համարել, ապա դրսևորեք ձեր սերը՝ սեղմելով ձախ կողմում գտնվող մի քանի ծափ 👏։ Այս կերպ դուք կարող եք տեղեկացնել ինձ, որ իմ աշխատանքը կարևոր է ձեզ համար: Այն դրդում է ավելին գրել: Եվ մի մոռացեք հետևել kotlin-arsenal հրապարակմանը արդի լինելու համար: Շնորհակալություն