Access
 sql >> база данни >  >> RDS >> Access

Създаване на незадължителни зависимости

В статията си вчера представих концепцията "влак на зависимост". Това се случва, когато импортирате функция от вашата библиотека с кодове, но в крайна сметка трябва да импортирате няколко допълнителни модула, само за да удовлетворите всички зависимости. Остава ви цял „влак“ от кодови модули, когато всичко, от което се нуждаехте, беше едно „место“ (функция).

В крайна сметка попадате в тази ситуация, когато модулите ви са тясно свързани. И така, какво можете да направите по въпроса? Има няколко начина да се справите с тази ситуация.

Нарушете "не се повтаряйте"

Един от начините за запазване на хлабавото свързване - което води до повече "самостоятелни" модули - е да създадете частни копия на функциите от изходния модул в извикващия модул. Това елиминира зависимостта между двата модула, но води до повтарящ се код.

Концепцията е проста. Копирате функцията от основния й кодов модул. След това го поставяте в модула за извикване, но го маркирате като частен, за да избегнете неяснота.

Това има смисъл в следните ситуации:

  • Прости методи без сложна логика.
  • Процедури, които е малко вероятно да се променят.
  • Когато рутината е част от много по-голям модул и не се нуждаете от никоя от другите функции в модула. Копирането на една функция избягва раздуването.

Този подход има следните недостатъци:

  • Ако има е грешка в копираната функция, ще трябва да я поправите на много места.
  • Имате дублиране на код, ако все пак импортирате изходния модул.

Изберете своите битки

Полагах много усилия, за да запазя всички мои стандартни модули на библиотеката с кодове напълно самостоятелни. Проблемът беше, че това доведе до много дублиране на код. Причината е, че повечето от функциите, които копирах в други модули за лична употреба, идват от модули, които така или иначе импортирах в приложението си.

Отличен пример за това бяха моите StringFunctions модул. Този модул има няколко прости метода, които съществуват до голяма степен, за да направят кода ми по-четлив. Например, имам Conc() функция, която включих като частна функция в повече от половината от моите модули на библиотеката с кодове.

С течение на времето осъзнах, че включих тези StringFunctions модул във всичките ми проекти. Никога не въвеждах нова зависимост, когато извиках функция от този модул. Губих време и въвеждах дублиран код за малка или никаква полза.

Имаше няколко кодови модула, които спокойно можех да предположа, че ще има във всяко приложение. Това бяха модулите с функции, които използвах най-често. Което означаваше, че много от тези зависимости по същество могат да бъдат игнорирани.

Сега поддържам "Стандартна библиотека" от кодови модули, които импортирам във всеки нов проект в самото начало. Свободно извиквам функции от тези модули, които вече са защитени със знанието, че няма да въвеждам нови зависимости.

Използвайте уникален маркер за коментар

Един от модулите в моята „Стандартна библиотека“ е модул за клас (clsApp ), който включва свойства и методи на ниво приложение, като текущото потребителско име и текста на заглавната лента. Излагам и други модули на класа от clsApp , като например clsStatus и clsRegistry , които осигуряват по-четлив достъп съответно до лентата на състоянието на достъпа и системния регистър на Windows.

Въпреки това, нямам нужда от достъп до лентата на състоянието или системния регистър на Windows във всеки проект. Така че, за да избегнете създаването на зависимост от clsStatus или clsRegistry класове, бих коментирал кода, препращащ тези класове, като използвам уникален „токен за коментар“.

Това е най-лесно да се демонстрира с пример:

' 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

Ако исках да активирам Status свойство на горния клас, мога да извърша глобално намиране и замяна на '$$ .

Това работеше добре за известно време, но винаги ми се струваше неудобно. Вероятно защото беше така. Другото нещо, което трябва да се отбележи, е, че токените за коментари трябва да бъдат глобално уникални в цялата ми библиотека с кодове. Това би било кошмар за поддръжка, ако се придържах към този подход дълго.

Използвайте условна компилация

Много по-чист подход е да се възползвате от условната компилация. Това са редовете във VBA, които започват със знак за паунд/хаштаг ("#"). Редове, които започват с този знак, подлежат на "предварителна обработка."

Какво е предварителна обработка? Това е стъпка, която езиците за програмиране предприемат преди компилацията. Така че, преди да настъпи каквато и да е проверка на времето за компилиране, редовете за предварителна обработка се оценяват. Това ни позволява да поставим код, който иначе не би могъл да се компилира в нашите проекти.

Как можем да се възползваме от това с нашите кодови библиотеки? Отново, това е най-лесно да се демонстрира с пример:

' 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

Най-доброто от двата свята

Както можете да видите, това е много чист начин да избегнете проблема "влак на зависимостта".

Позволява ни да създаваме незадължителни зависимости . Всяка част от кода, която разчита на друг модул на библиотека с код, се обвива в условна компилация #If ... Then. Всички константи за условна компилация са изброени в горната част на кодовия модул.

Сега, когато импортираме отново актуализирана версия на нашия модул с библиотека с кодове, просто трябва да преминем през и да настроим флаговете за условна компилация до много от това, което беше там преди. Ако не си спомняме как са били зададени флаговете, трябва да можем да продължим да компилираме и коригираме флаговете, докато проектът се компилира напълно.

И ако използваме контрол на версиите, не е нужно да се притесняваме, че ще забравим какво е имало преди.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Достъп до файлов DSN от Java

  2. Как Access общува с ODBC източници на данни? част 3

  3. Как да отворите таблица в Design View в Microsoft Access

  4. Как да актуализирате свързани таблици в Access 2016, след като бекенд базата данни се премести на ново местоположение

  5. Функция за промяна на регистра на VBA