Модуль (шаблон проєктування)
При розробці програмного забезпечення, Модуль це шаблон проєктування, який дозволяє реалізувати концепцію програмних модулів, яка визначена в модульному програмуванні, в мові програмування з неповною підтримкою цієї концепції.
Цей шаблон може реалізовуватись багатьма способами, в залежності від мови програмування для якої він застосовуються, наприклад із застосуванням шаблону одинак, статичними членами класу при об'єктному програмуванні і глобальними функціями при процедурному програмуванні.
Визначення[ред. | ред. код]
Шаблон проєктування програмного забезпечення модуль реалізує властивості і синтаксичну структуру визначену як парадигма модульного програмування при використанні в мовах програмування які мають неповну підтримку цієї концепції.
Концепція[ред. | ред. код]
При розробці програмного забезпечення, програмний код може бути розділений на компоненти, які реалізують конкретну функцію або містять усе необхідне для вирішення конкретної задачі. Модульне програмування є одним з підходів реалізації цього.
Концепція модульності не підтримується повністю в багатьох мовах програмування.
Характеристики[ред. | ред. код]
Для того, щоб цей шаблон можна було реалізувати за допомогою шаблону одинака, або за допомогою іншого способу групування пов'язаного коду, необхідно виконати наступні умови:
- Частина коду має мати глобальну або публічну область видимості і спроєктована для глобального/публічного використання. Додаткові приховані і захищені методи або код можуть виконуватись через доступ до публічного коду.
- Модуль повинен мати функцію ініціалізації яка є еквівалентною, або комплементарною методу конструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
- Модуль повинен мати функцію фіналізації, яка є еквівалентною, або комплементарною методу деструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
- Члени модуля можуть потребувати виконання коду ініціалізації/фіналізації, який виконується за допомогою функції ініціалізації/фіналізації модуля.
- Загалом більша частина членів модуля виконує операції з зовнішніми елементами по відношенню до цього класу, які передаються як аргументи при викликанні функцій. Такі функції являють собою "утиліти", "засоби" або "бібліотеки".
Реалізація[ред. | ред. код]
Семантика і синтаксис конкретної мови програмування впливає на спосіб реалізації цього шаблону.
Об'єктно-орієнтовані мови програмування[ред. | ред. код]
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: Elements of Reusable Object-Oriented Software [Архівовано 9 листопада 2012 у Wayback Machine.]
Література[ред. | ред. код]
Алан Шаллоуей, Джеймс Р. Тротт. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М. : «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.