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

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

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

Визначення

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

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

Концепція

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

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

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

Характеристики

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

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

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

Реалізація

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

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

Об'єктно-орієнтовані мови програмування

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

Хоча мова 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.