Модуль (шаблон проєктування)
При розробці програмного забезпечення, Модуль це шаблон проєктування, який дозволяє реалізувати концепцію програмних модулів, яка визначена в модульному програмуванні, в мові програмування з неповною підтримкою цієї концепції.
Цей шаблон може реалізовуватись багатьма способами, в залежності від мови програмування для якої він застосовуються, наприклад із застосуванням шаблону одинак, статичними членами класу при об'єктному програмуванні і глобальними функціями при процедурному програмуванні.
Визначення
Шаблон проєктування програмного забезпечення модуль реалізує властивості і синтаксичну структуру визначену як парадигма модульного програмування при використанні в мовах програмування які мають неповну підтримку цієї концепції.
Концепція
При розробці програмного забезпечення, програмний код може бути розділений на компоненти, які реалізують конкретну функцію або містять усе необхідне для вирішення конкретної задачі. Модульне програмування є одним з підходів реалізації цього.
Концепція модульності не підтримується повністю в багатьох мовах програмування.
Характеристики
Для того, щоб цей шаблон можна було реалізувати за допомогою шаблону одинака, або за допомогою іншого способу групування пов'язаного коду, необхідно виконати наступні умови:
- Частина коду має мати глобальну або публічну область видимості і спроєктована для глобального/публічного використання. Додаткові приховані і захищені методи або код можуть виконуватись через доступ до публічного коду.
- Модуль повинен мати функцію ініціалізації яка є еквівалентною, або комплементарною методу конструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
- Модуль повинен мати функцію фіналізації, яка є еквівалентною, або комплементарною методу деструктора об'єкта. Така можливість відсутня при використанні звичайних просторів імен.
- Члени модуля можуть потребувати виконання коду ініціалізації/фіналізації, який виконується за допомогою функції ініціалізації/фіналізації модуля.
- Загалом більша частина членів модуля виконує операції з зовнішніми елементами по відношенню до цього класу, які передаються як аргументи при викликанні функцій. Такі функції являють собою "утиліти", "засоби" або "бібліотеки".
Реалізація
Семантика і синтаксис конкретної мови програмування впливає на спосіб реалізації цього шаблону.
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.