Մոդուլ (նախագծման ձևանմուշ)

**Մոդուլ** (), կառուցվածքային նախագծման ձևանմուշ, որն օգտագործվում է ծրագրավորման մոդուլի հասկացողությունն իրականացնելու համար այն ծրագրավորման լեզուներում, որտեղ այդ հասկացողությունը չի սպասարկվում։

Ծրագրավորման լեզվից կախված այս ձևանմուշը կարելի է իրականացնել տարբեր կերպ՝ որպես եզակի օգտագործման ձևանմուշ, օբյեկտ-կողմնորոշված ստատիկ անդամ () դասում և պրոցեդուրային գլոբալ ֆունկցիաներում։ Python-ում ձևանմուշը ներկառուցված է լեզվի մեջ և յուրաքանչյուր .py ֆայլը ավտոմատորեն հանդիսանում է մոդուլ։

## Ընդհանուր հասկացողություններ
* Client - հայցող
* Instance - նմուշ
* Implementation - իրականացում
* Product - արգասիք

## Նկարագրություն և կառուցվածք
Մոդուլ ձևանմուշը ապահովում է ֆունկցիաներ և ստատիկ կառուցվածքներ մուդուլային հասկացողությունն այն լեզուներում իրականացնելու համար, որոնք չեն սպասարկում այդ հասկացողությունը։

center|thumb|650px

## Հատկանիշներ
Այս ձևանմուշը եզակի նախագծման կամ այլ խմբի ձևանմուշներով իրականացնելիս պետք է հաշվի առնել, որ ձևանմուշը պետք է ապահովի հետևյալ հատկանիշներին.
* Ծրագրի կոդի մի մասը պետք է լինի գլոբալ կամ ունենա public հասանելիություն որպես գլոբալ կամ public կոդ։ private կամ protected կոդը կարելի է իրականացնել public կոդի միջոցով։
* Մոդուլը պետք է ունենա ինիցիալիզադիայի ֆունկցիա, որը համարժեք է օբյեկտ-կնոստրուկտոր մեթոդին։ Այս հատկանիշը չի սպասարկվում ռեգուլյար `namespace`-ով։
* Մոդուլը պետք է ունենա `finalizer` ֆունկցիա, որն համարժեք է օբյեկտի դեստրուկտորին։ Այս ֆունկցիան նույնպես չի սպասարկվում ռեգուլյար `namespace`-ի կողմից։
* Ֆունկցիաների շատ անդամենր, որոնք գործողություններ են իրականացնում դասի մեջ, տրվում են ֆունկցիայի կանչի արգումենտների տեսքով։ Նմանատիպ ֆունկցիաներ են օրինակ "utilities", "tools" կամ "libraries":

## Օրինակներ
### C# (C Sharp .Net)
#### Հայտարարում


```csharp
using System;
using System.IO;
using System.Text;

namespace Consoles {

  public sealed class MainModule {
    private static MainModule Singleton = null;
    public InputStream input = null;
    public OutputStream output = null;
    public ErrorStream error = null;

    // ...

    public MainModule () {
      // does nothing on purpose !!!
    }

    // ...

    public 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(Integer 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(Integer Value) {
      // to-do: ...
    }
  
    public void ScanBoolean(Boolean Value) {
      // to-do: ...
    }
    
    // ...
  
  }
}
```


#### Իրականացում


```csharp
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()
    {
      Console.PrintString("Hello World");
      Console.PrintNewLine();
      Console.ScanNewLine();
    }
   
    public static void main()
    {
      prepare();
      execute(args);
      unprepare();
    }
  }
```


### Java
#### Հայտարարում


```java
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() {
    // does nothing on purpose !!!
  }

  // ...

  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: ...
  }
  
  // ...
  
}
```


##### Իրականացում

```java
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();
  }
}
```


Կատեգորիա:Ծրագրավորում