sql >> Databáze >  >> RDS >> Access

Vytváření volitelných závislostí

Ve svém včerejším článku jsem představil koncept „Vlak závislosti“. To se stane, když importujete funkci z vaší knihovny kódů, ale nakonec budete muset importovat několik dalších modulů, abyste uspokojili všechny závislosti. Zůstal vám celý „vlak“ kódových modulů, když vše, co jste potřebovali, bylo jediné „sedadlo“ (funkce).

Dostanete se do této situace, když jsou vaše moduly pevně spojeny. Co s tím tedy můžete dělat? Existuje několik způsobů, jak tuto situaci vyřešit.

Porušovat "neopakuj se"

Jedním ze způsobů, jak zachovat volné propojení – což má za následek více „samostatných“ modulů – je vytvořit soukromé kopie funkcí ze zdrojového modulu ve volajícím modulu. To eliminuje závislost mezi dvěma moduly, ale výsledkem je opakující se kód.

Koncept je jednoduchý. Funkci zkopírujete z jejího modulu primárního kódu. Poté jej vložíte do volajícího modulu, ale označíte jej jako soukromý, abyste předešli nejednoznačnosti.

To dává smysl v následujících situacích:

  • Jednoduché metody bez složité logiky.
  • Postupy, které se pravděpodobně nezmění.
  • Pokud je rutina součástí mnohem většího modulu a nepotřebujete žádné další funkce v modulu. Kopírováním jedné funkce se vyhnete nadýmání.

Tento přístup má následující nevýhody:

  • Pokud existuje chyba v zkopírované funkci, budete ji muset opravit na mnoha místech.
  • Pokud přesto importujete zdrojový modul, dojde ke zdvojení kódu.

Vyberte si bitvy

Kdysi jsem šel do velké míry, abych všechny své standardní moduly knihovny kódu nechal zcela samostatné. Problém byl v tom, že to vedlo k velkému duplikování kódu. Důvodem je, že většina funkcí, které jsem kopíroval do jiných modulů pro soukromé použití, pocházela z modulů, které jsem stejně importoval do své aplikace.

Ukázkovým příkladem toho byly moje StringFunctions modul. Tento modul má několik jednoduchých metod, které z velké části existují, aby byl můj kód čitelnější. Například mám Conc() funkci, kterou jsem zahrnul jako soukromou funkci do více než poloviny mých modulů knihovny kódu.

Postupem času jsem si uvědomil, že jsem zahrnul StringFunctions modul ve všech mých projektech. Nikdy jsem nezaváděl novou závislost, když jsem volal funkci z tohoto modulu. Ztrácel jsem čas a zaváděl duplicitní kód s malým nebo žádným přínosem.

Bylo tam několik modulů kódu, o kterých jsem mohl bezpečně předpokládat, že budou v každé aplikaci. To byly moduly s funkcemi, které jsem používal nejčastěji. Což znamenalo, že mnohé z těchto závislostí bylo možné v podstatě ignorovat.

Nyní udržuji "Standardní knihovnu" modulů kódu, které importuji do každého nového projektu na úplném začátku. Volně volám funkce z těchto modulů nyní bezpečné s vědomím, že nebudu zavádět nové závislosti.

Použijte jedinečný token komentáře

Jedním z modulů v mé „Standardní knihovně“ je modul třídy (clsApp ), která zahrnuje vlastnosti a metody na úrovni aplikace, jako je aktuální uživatelské jméno a text záhlaví. Také vystavuji další moduly tříd z clsApp , například clsStatus a clsRegistry , které poskytují čitelnější přístup ke stavovému řádku Access a registru Windows.

Nepotřebuji však v každém projektu přístup ke stavovému řádku nebo registru Windows. Aby se zabránilo vytvoření závislosti na clsStatus nebo clsRegistry tříd, okomentoval bych kód odkazující na tyto třídy pomocí jedinečného "tokenu komentáře."

Nejsnáze to lze demonstrovat na příkladu:

' Notes     
' - Find and replace '$$ with blank to enable Status property (requires clsStatus)
' - Find and replace '&& with blank to enable Reg property (requires clsRegistry)

'$$Private m_objStatus As clsStatus
'&&Private m_objReg As clsRegistry

'$$Public Property Get Status() As clsStatus
'$$    Set Status = m_objStatus
'$$End Property

'&&Public Property Get Reg() As clsRegistry
'&&    Set Reg = m_objReg
'&&End Property

Private Sub Class_Initialize()
    '$$    Set m_objStatus = New clsStatus
    '&&    Set m_objReg = New clsRegistry
End Sub

Pokud bych chtěl povolit Status vlastnost výše uvedené třídy, mohl bych provést globální hledání a nahrazení na '$$ .

Chvíli to fungovalo dobře, ale vždy mi to připadalo nemotorné. Asi proto, že to tak bylo. Další věc, kterou je třeba poznamenat, je, že tokeny komentářů by musely být globálně jedinečné v celé mé knihovně kódu. To by byla noční můra údržby, kdybych u tohoto přístupu zůstal dlouho.

Použít podmíněnou kompilaci

Mnohem čistším přístupem je využít výhody podmíněné kompilace. Toto jsou řádky ve VBA, které začínají znakem libra/hashtag ("#"). Řádky začínající tímto znakem podléhají "předzpracování."

Co je předzpracování? To je krok, který programovací jazyky podniknou před kompilací. Než tedy dojde ke kontrole času kompilace, vyhodnotí se řádky předběžného zpracování. To nám umožňuje umístit kód, který by se jinak nepodařilo zkompilovat, do našich projektů.

Jak toho můžeme využít s našimi knihovnami kódů? Opět je to nejjednodušší demonstrovat na příkladu:

' Notes 
' - Replace the '$$ and '&& kludges with conditional compilation

#Const EnableStatusProperty = True  'If True, requires import of clsStatus class
#Const EnableRegProperty = False  'If True, requires import of clsRegistry class

#If EnableStatusProperty Then
Private m_objStatus As clsStatus
#End If
#If EnableRegProperty Then
Private m_objReg As clsRegistry
#End If

#If EnableStatusProperty Then
Public Property Get Status() As clsStatus
    Set Status = m_objStatus
End Property
#End If

#If EnableRegProperty Then
Public Property Get Reg() As clsRegistry
    Set Reg = m_objReg
End Property
#End If

Private Sub Class_Initialize()
#If EnableStatusProperty Then
    Set m_objStatus = New clsStatus
#End If
#If EnableRegProperty Then
    Set m_objReg = New clsRegistry
#End If
End Sub

To nejlepší z obou světů

Jak vidíte, je to velmi čistý způsob, jak se vyhnout problému „závislosti“.

Umožňuje nám vytvářet volitelné závislosti . Každý kus kódu, který závisí na jiném modulu knihovny kódu, je zabalen do podmíněné kompilace příkazu #If ... Then. Všechny konstanty podmíněné kompilace jsou uvedeny v horní části modulu kódu.

Nyní, když znovu importujeme aktualizovanou verzi našeho modulu knihovny kódu, musíme jednoduše projít a nastavit příznaky podmíněné kompilace na stejné hodnoty, jaké byly dříve. Pokud si nepamatujeme, jak byly nastaveny příznaky, měli bychom být schopni kompilovat a upravovat příznaky, dokud se projekt zcela nezkompiluje.

A pokud používáme správu verzí, nemusíme se bát, že zapomeneme, co tam bylo předtím.


  1. PŘÍPAD SQL:Poznejte a vyhněte se 3 méně známým potížím

  2. Co je MariaDB TX? Jak spravovat nový MariaDB MySQL Fork!

  3. Zařazení SQL Serveru do distribuované transakce XA

  4. Vytvořte kontingenční zobrazení v SQL z tabulky SQL