Модуль (шаблон проєктування)

При розробці програмного забезпечення, Модуль це шаблон проєктування, який дозволяє реалізувати концепцію програмних модулів, яка визначена в модульному програмуванні, в мові програмування з неповною підтримкою цієї концепції.

Цей шаблон може реалізовуватись багатьма способами, в залежності від мови програмування для якої він застосовуються, наприклад із застосуванням шаблону одинак, статичними членами класу при об'єктному програмуванні і глобальними функціями при процедурному програмуванні.

Визначення[ред. | ред. код]

Шаблон проєктування програмного забезпечення модуль реалізує властивості і синтаксичну структуру визначену як парадигма модульного програмування при використанні в мовах програмування які мають неповну підтримку цієї концепції.

Концепція[ред. | ред. код]

При розробці програмного забезпечення, програмний код може бути розділений на компоненти, які реалізують конкретну функцію або містять усе необхідне для вирішення конкретної задачі. Модульне програмування є одним з підходів реалізації цього.

Концепція модульності не підтримується повністю в багатьох мовах програмування.

Характеристики[ред. | ред. код]

Для того, щоб цей шаблон можна було реалізувати за допомогою шаблону одинака, або за допомогою іншого способу групування пов'язаного коду, необхідно виконати наступні умови:

  • Частина коду має мати глобальну або публічну область видимості і спроєктована для глобального/публічного використання. Додаткові приховані і захищені методи або код можуть виконуватись через доступ до публічного коду.
  • Модуль повинен мати функцію ініціалізації яка є еквівалентною, або комплементарною методу конструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
  • Модуль повинен мати функцію фіналізації, яка є еквівалентною, або комплементарною методу деструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
  • Члени модуля можуть потребувати виконання коду ініціалізації/фіналізації, який виконується за допомогою функції ініціалізації/фіналізації модуля.
  • Загалом більша частина членів модуля виконує операції з зовнішніми елементами по відношенню до цього класу, які передаються як аргументи при викликанні функцій. Такі функції являють собою "утиліти", "засоби" або "бібліотеки".

Реалізація[ред. | ред. код]

Семантика і синтаксис конкретної мови програмування впливає на спосіб реалізації цього шаблону.

Об'єктно-орієнтовані мови програмування[ред. | ред. код]

Java[ред. | ред. код]

Хоча мова Java підтримує нотацію просторів імен (namespace), скорочена версія модуля, в деяких випадках можна отримати вигоду від використання шаблону проєктування замість використання просторів імен.

Наступний приклад використовує шаблон проєктування одинак.

Визначення[ред. | ред. код]
package consoles;  import java.io.InputStream; import java.io.PrintStream;  public final class MainModule {    private static MainModule singleton = null;    public InputStream input = null;   public PrintStream output = null;   public PrintStream error = null;    public MainModule() {     // навмисне нічого не робить !   }    // ...    public static MainModule getSingleton() {     if (MainModule.singleton == null) {        MainModule.singleton = new MainModule();     }       return MainModule.singleton;   }    // ...    public void prepare() {     //System.out.println("consoles::prepare();");      this.input = new InputStream();     this.output = new PrintStream();     this.error = new PrintStream();   }      public void unprepare() {     this.output = null;     this.input = null;     this.error = null;        //System.out.println("consoles::unprepare();");   }      // ...      public void printNewLine() {     System.out.println();   }    public void printString(String value) {     System.out.print(value);   }    public void printInteger(int value) {     System.out.print(value);   }    public void printBoolean(boolean value) {     System.out.print(value);   }      public void scanNewLine() {     // to-do: ...   }      public void scanString(String value) {     // to-do: ...   }    public void scanInteger(int value) {     // to-do: ...   }    public void scanBoolean(boolean value) {     // to-do: ...   }      // ...    } 
Застосування[ред. | ред. код]
import consoles;  class ConsoleDemo {   public static MainModule console = null;    public static void prepare() {     console = MainModule.getSingleton();      console.prepare();   }    public static void unprepare() {     console.unprepare();   }    public static void execute(String[] args) {     console.printString("Hello World");     console.printNewLine();     console.scanNewLine();   }    public static void main(String[] args) {     prepare();     execute(args);     unprepare();   } } 

C# (C Sharp .Net)[ред. | ред. код]

C#, так само як Java, підтримує простори імен, тим не менш шаблон може бути корисним в деяких випадках.

Наступний приклад використовує шаблон проєктування одинак.

Визначення[ред. | ред. код]
using System;  namespace Consoles { 	 	public sealed class MainModule { 		public InputStream  input  = null; 		public OutputStream output = null; 		public ErrorStream  error  = null;  		 		private static MainModule Singleton = null;  		// ...  		public MainModule () { 			// навмисне нічого не робить !!! 		}  		// ...  		public static MainModule getSingleton() { 			if (MainModule.Singleton == null) 			{ 				MainModule.Singleton = new MainModule(); 			}  			return MainModule.Singleton; 		}  		// ...  		public void prepare() { 			//System.WriteLine("console::prepare();");  			this.input  = new InputStream(); 			this.output = new OutputStream(); 			this.error  = new ErrorStream(); 		}  		public void unprepare() { 			this.output = null; 			this.input  = null; 			this.error  = null;  			//System.WriteLine("console::unprepare();"); 		}  		// ...    		public void printNewLine() { 			System.Console.WriteLine(""); 		}    		public void printString(String Value) { 			System.Console.Write(Value); 		}    		public void printInteger(Int32 Value) { 			System.Console.Write(Value); 		}    		public void printBoolean(Boolean Value) { 			System.Console.Write(Value); 		}  		public void ScanNewLine() { 			// to-do: ... 		}  		public void ScanString(String Value) { 			// to-do: ... 		}    		public void ScanInteger(Int32 Value) { 			// to-do: ... 		}    		public void ScanBoolean(Boolean Value) { 			// to-do: ... 		}  		public void PrintString(String Value) 		{ 			// to-do: ... 		}  		public void PrintNewLine() 		{ 			// to-do: ... 		} 		// ... 	} } 
Застосування[ред. | ред. код]
class ConsoleDemo { 	public static Consoles.MainModule Console = null;  	public static void prepare() 	{ 		Console = Consoles.MainModule.getSingleton();  		Console.prepare(); 	}  	public static void unprepare() 	{ 		Console.unprepare(); 	}  	public static void execute(string[] strings) 	{ 		Console.PrintString(strings[0]); 		Console.PrintNewLine(); 		Console.ScanNewLine(); 	}  	public static void Main(string[] args) 	{ 		prepare(); 		execute(args); 		unprepare(); 	} } 

Джерела[ред. | ред. код]

Література[ред. | ред. код]

Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.