4. Կախվածություն  որոշող ֆայլ

Classycle -ի կախվածության ստուգողը օգտագործում է կախվածություն որոշող ֆայլ (file type .ddf) , որպեսզի ստուգի ոչ ցանկալի կախվածությունները: Կախվածություն որոշող ֆայլերը տեքստային ֆայլեր են ( նրանց շարահյուսությունը  բացատրված է ներքեւում  ), որոնք որոշում են դասերի շարքերը, եւ նրանց միջեւ կապերի անկախությունը: Այս հարաբերությունները ստուգվում են եւ , եթե չեն աշխատում, նրանց մասին զեկուցվում է:

4.1 Օրինակ

Հետեւյալ օրինակ ֆայլը պարունակում է հրահանգների բոլոր տեսակները


#
# Սա կախվածություն որոշող ֆայլի մի օրինակ է
#
show allResults

{package} = classycle

[util] = ${package}.util.*
[non-util] = ${package}.* excluding [util]
[class-file] = ${package}.classfile.*

check sets [util] [non-util] [class-file]

check [util] independentOf [non-util]
check [class-file] independentOf [util]
check ${package}.ant.* independentOf java.util.* java.awt.* \
                                     javax.swing.*

check absenceOfClassCycles > 1 in [util]
check absenceOfPackageCycles > 1 in ${package}.*

layer basic = [class-file] [util]
layer dependency = ${package}.dependency.*

check layeringOf basic dependency

Արդյունքը լռելայն դուրս բերելելու հետ միասին, output — ը կարդում է

show onlyShortestPaths allResults
Set [util] has 8 classes.
Set [non-util] has 78 classes.
Set [class-file] has 14 classes.
check [util] independentOf [non-util]   OK
check [class-file] independentOf [util] OK
check classycle.ant.* independentOf java.util.*
  Dependency found:
  classycle.ant.ClassycleTask
    -> java.util.LinkedList
    -> java.util.ArrayList
    -> java.util.Iterator
  classycle.ant.ReportTask
    -> java.util.HashSet
  classycle.ant.DependencyCheckingTask
    -> java.util.Map
    -> java.util.Hashtable
    -> java.util.Properties
check classycle.ant.* independentOf java.awt.*  OK
check classycle.ant.* independentOf javax.swing.*       OK
check absenceOfClassCycles > 1 in [util]        OK
check absenceOfPackageCycles > 1 in classycle.*
  classycle.renderer et al. contains 2 packages:
    classycle.renderer
    classycle
check [class-file] directlyIndependentOf [util] OK
check [util] directlyIndependentOf [class-file] OK
check [class-file] directlyIndependentOf classycle.dependency.* OK
check [util] directlyIndependentOf classycle.dependency.*       OK

4.2 Շարահյուսություն

  • Տողերը սկսվում են  ‘#’ — ով, իսկ դատարկ տողերը արհամարհվում են:
  • հրահանքը գրավում է մեկ տող: Այն կարելի է ծածկել մի քանի տողով, եթե նախորդ տողը վերջանում է  ‘\’.
  • Գոյություն ունեն երկու տեսակի հրահանգներ
    Սահմանումներ

    • Հատկանիշի սահմանումներ
    • Շարքի սահմանումներ
    • Շերտի սահմանումներ

    եւ հայտարարություններ

    • Շարքի ցուցադրման նախապատվություն
    • Ստուգողական շարքեր
    • Ստուգողական ցիկլեր
    • Դասերի կախվածության ստուգում
    • Շերտավորման ստուգում

    Հայտարարությունները իրագործվում են  DependencyProcessor — ի կողմից: Նրանք վերադարձնում են կամ  ok կամ ձախողվում են:

4.2.1 Սահմանումներ

4.2.1.1Հատկանիշի սահմանումներ

Սինոպսիս
Որոշում է այն հատկանիշը, որը կարող ե օգտագործվել ցանկացած հաջորդ տողում:
Շարահյուսություն
       {<property name>} = <any string>

որտեղ <property name> -ը  հատկանիշի անունն է եւ <ցանկացած տող > -ը  ցանկացած տողն է առանց առաջից կամ  հետեւվից եկող տարածությամբ :

Հատկանիշներին հղում են արվում հետեւյալ կերպ

       ${<property name>}
Սեմանիկ
Հատկանիշները կարող են օգտագործվել իրենց սահմանումից հետո:  Մինչեւ տողը ֆայլի մեջ վերլուծվում է, որոշվում են հատկանիշային հնարավոր հղումները: Հղում կատարելը դեռեւս  չսահմանված հատկանիշի վրա կարող ե բերել սխալի: Հատկանիշները կարող են վերասահմանվել:

Կախվածություն որոշող ֆայլի մեջ համակարգի բոլոր հատկանիշները առկա են, որպես լռելայն հատկանիշներ: Նրանց կարելի է խմբավորել  Java VM  գծային փաստարկ հրահանգով:

       -D<property name>=<any string>

DependencyCheckingTask — ում ներդրված կախվածություն որոշող հրահանգների դեպքում, հատկանիշները, որոնք սահմանված են  անտ սկրիպեում , առկա են, որպես լռելայն հատկանիշներ: (տես Chapter 1.2.2. օրինակի համար).

Ծանուցում. Երբ վերասահմանում ենք լռելայն հատկանիշները , սկզբնական համակարգային հատկանիշները կամ անտ հատկանիշները չեն փոխվում:

4.2.1.2 Շարքի սահմանում

Սինոպսիս.
Որոշում է դասերի շարքը
Շարահյուսություն.
       [<set name>] = <term>1..*

կամ

       [<set name>] = <term>0..* excluding <term>1..*

որտեղ <set name> — ը շարքի միակ անունն է: Այն չպետք է  պարունակի ‘[‘, ‘]’, կամ սպիտակ տարածություններ: <term> — ը կամ շարք է, որը մատնանշվում է իր անունով եւ չակերտներով, կամ էլ  վայլդ-քարտի օրինակ, ամբողջությամբ որակավորված կարգանունի համար: Ի նկատի ունեցեք որ միայն  ‘*’ — ն է թույլատրված, որպես վայլդ-քարտի նիշ:  subscripts 1..* — ը ցույց է տալիս մեկ- կամ- մի քանի տերմիններ :d

Սեմանտիկ
Յուրաքանչյուր տերմին սահմանում է կարգերի շարք: Տերմինների հաջորդականությունը նշանակում է այս տերմինների միացյալ շարք: excluding օպերացիան նշանակում է այլ շարքի ստեղծում: Հիշեք, որ շարքը նույնպես կարող է պարունակել արտաքին կարգեր:

4.2.1.3 Շերտի սահմանում

Սինոպսիս
Սահմանում է շերտը, որպես կարգերի շարքերի շարք:
       layer <layer name> = <term>1..*

որտեղ <layer name> -ը շերտի միակ անունն է: Այն չպետք է պարունակի սպիտակ տարածքներ:    <term>-ը 

Յուրաքանչյուր տերմին ցույց է տալիս մեկ կարգերի շարք: Շերտը իրենից ներկայացնում է այսպիսի շարքերի շարք:

4.2.2 Հայտարարություն

Բոլոր հայտարարությունները  բերում են  արդյունքի, որը կամ դրական է, կամ էլ բացասական:

4.2.2.1 Շարքի ցուցադրման նախապատվություն

Սինոպսիս
Որոշեք, թե որ ցուցադրմանն եք  նախապատվություն տալիս
Շարահյուսություն
       show <preference>

որտեղ <preference>-ը  այն նախապատվությունն է, որ ճանաչված է օգտագործվող

ResultRenderer — ի կողմից: Ներկայումս բոլոր ResultRenderer- ները հավանություն են տանում այն նախապատվությանը, որը ստեղծվել է  DefaultPreferenceFactory-ի կողմից:
Սեմանտիկ
Ցուցադրման նախապատվությունը կառավարում է բոլոր հայտարարությունների արդյունքների մատուցումը, որոնք տրվում են այս հայտարարությունից հետո: Այս տիպի հայտարարության արդյունքը միշտ լինում է ok:

4.2.2.2Ստուգողական շարքեր

Սինոպսիս
Ստուգում է, արդյոք կարգերի շարքերը դատարկ են , թե ոչ
Շարահյուսություն:
       check sets <set>1..*

որտեղ  <set> -ը կամ շարքի անունն է, ինչպես ասվում է շարքի սահմանման մեջ, կամ է վայլդ-քարտի մի օրինակ է:

Սեմանտիկ:
Ստուգում է, արդյոք նշված շարքերը դատարկ են, թե ոչ: Արդյունքը դրական է, եթե յուրաքանչյուր շարք պարունակում է ամենապակասը մեկ կարգ:

Այս հրահանգի հիմնական նպատակն է հայտնաբերել սխալ գրված շարքի սահմանումները:

4.2.2.3 Ստուգել  ցիկլերը

Սինոպսիս 
Ստուգում է, արդյոք կարգերի շարքը ունի կարգ/փաթեթ ցիկլեր, որոնք գերազանցում են որոշված        չափը:.
Շարահյուսություն
       check absenceOfClassCycles > <maximum size> in <set>

կամ

       check absenceOfPackageCycles > <maximum size> in <set>
որտեղ <maximum size>-ը կարգ/փաթեթի այն մաքսիմում քանակն է, որ ցիկլը ( ավելի ճիշտ - ուժեղ բաղադրիչը) թույլատրված է ունենալ: Դա պետք է լինի դրական թիվ: <set> -ը կամ  հենց շարքի անունն է, ինչպես գրված է շարքի սահմանման մեջ, կամ էլ վայդ-քարտի օրինակ:
Սեմանտիկ
Եթե նշված շարքում չկան ցիկլեր, որոնք գերազանցում են մաքսիմում չափը, ապա արդյունքը ok է
Նկատի ունեցեք,որ ուժեղ բաղադրիչները կարող են չերեվալ, եթե նրանք միայն մասամբ են ծածկված նշված շարքով:

4.2.2.4 Կարգերի կախվածության ստուգում

Սինոպսիս:
Ստուգում է, արդյոք կարգերի շարքերը կախված/կախված չեն կարգերի մյուս շարքերից:
Շարահյուսություն
       check <set>1..* independentOf <set>1..*

կամ

       check <set>1..* directlyIndependentOf <set>1..*

կամ

       check <set>1..* dependentOnlyOn <set>1..*

որտեղ <set>-ը կամ շարքի անունն է, ինչպես սահմանված է շարքի սահմանման մեջ, կամ էլ վայլդ-քարտի օրինակ:

  • independentOf/directlyIndependentOf: Այն ստուգում է, արդյոք գտնված է այն ճանապարհը, որ տանում է ձախ կողմի շարքերով սահմանված շարքի կարգից դեպի աջ կողմի շարքի կարգ: Արդյունքը ok է, եթե ոչ մի ճանապարհ չի գտնված: Օպերացիա directlyIndependentOf: անում է ավելի թույլ ստուգում: Այն փնտրում է  միայն ուղիղ հղումներ ձախ կողմում գտնվող շարքերի կարգերից դեպի այն կարգերը, որ գտնվում են աջ կողմում: Եթե հայտնաբերվում են կախվածութուններ, ապա սուբգրաֆը պահվում է արդյունքի մեջ:Եթե շարքերի խմբերը նշված են կամ աջ կամ ձախ կողմում, հայտարարությունը կիսվում է այդ զույգերի հայտարարությունների, որտեղ մի շարքը ձախ կողմից է, իսկ մյուսը- աջ կողմից: Այսպիսով, a սկզբնական հայտարարությունը, n ձախակողմյան շարքերը եւ  m աջակողմյան շարքերը վերածում է   n  հատ m հայտարարությունների:
  • dependentOnlyOn: Այն ստուգում է, արդյոք ձախակողմյան խնբի յուրաքանչյուր շարք ուղղակիորեն կախված է  միայն իրենից, թե աջակողմյան խնբի շարքերի միավորումից: Այսինքն, ստուգումը ձախողվում է, եթե կա մի կարգ ձախակողմյան շարքերից մեկում, որը ուղղակիորեն կախված է կարգից, որը չկա ոչ նշված շարքում, ոչ էլ աջակողմյան խմբի շարքերից մեկում:Եթե ձախակողմյան խումբը  ունի մեկից ավելի շարք, հայտարարությունը բաժանվում է  n հայտարարությունների, որտեղ n -ը ձախակողմյան խմբի շարքերի քանակն է: Յուրաքանչյուր հայտարարություն ստուգում է միայն մեկ շարքի կախվածությունը:

4.2.2.5 Շերտերի ստուգում

Սինոպսիս
Ստուգում է շերտի ճարտարապետությունը:
Շարահյուսություն
       check layeringOf <layer>1..*

կամ

       check strictLayeringOf <layer>1..*

որտեղ <layer> -ը ցույց է տալիս շերտի անունը, ինչպես ասված ե շերտի սահմանման մեջ:

Սեմանտիկ:
Սա հարմար հայտարարություն է ստուգելը համար, արդյոք մի բուրգ շերտերը կառուցում են շերտավոր ճարտարապետություն , թե ոչ: Ձախից ամենավերջին ( աջից ամենավերջին) շերտը ամենատակի (ամենավերեւի) շերտն է: Հայտարարությունը վերածվում է այդ տիպի մի քանի հայտարարությունների, ստուգելով ուղիղ անկախությունը  (directlyIndependentOf)  հետեւյալ կախվածությունների համար, որոնք թույլատրված չեն:

  • Շերտը սահմանող շարքերի միջեւ
  • Ավելի ներքեւի շերտից մինչեւ ավելի վերեւի շերտը
  • Ավելի վերեւվի շերտից մինչեւ այն շերտը, որը անմիջապես նրա տակը չի, եթե strictLayeringOf -ն է օգտագործված:

Ահա մի օրինակ բաղկացած հինգ շարքերից, որոնք կազմակերպված են երեք շերտից: Սլաքները ցույց են տալիս թույլատրված ուղղակի կախվածությունները: Բոլոր մյուս ուղիղ կախվածությունները արգելված են: Ընդհատված սլաքները ցույց են տալիս արգելված կախվածոխթյունները խիստ շերտավորման դեպքում:

source: http://classycle.sourceforge.net/ddf.html