開発

[binllion] モジュール化する

前回、機能毎に関数で切り出して細分化してみましたがよりRustぽくするためにモジュール化を行います。

モジュールとすることで関連するコードをまとめたり、アクセス範囲を狭めたり、処理内容を隠蔽することができます。

fn main
// AlternateScreenへ移行
// raw モードに移行
// イベント処理

fn handle_events
// イベントハンドラ
   // match式でResultを処理

fn handle_key_events
// キー入力処理
   // Ctrl や SHIFT等のコンビネーションキー処理
      // Ctrlが押されている場合
         // Ctrl + qが入力されたら
            // raw モードを解除
            // AlternateScreenから復帰
            // アプリケーション終了処理
   // 通常のキー入力処理
// 入力されたキーを画面出力

fn dbg_print_key_code
// 入力されたキーを画面出力Code language: JavaScript (javascript)

上記がソースコードのコメントを元にした大まかな機能の内容です。

大きく分けると画面の初期化と復旧、イベント処理の2つになります。

とりあえずこの2つでモジュールを作り、細かい機能を関数として定義してみます。

# 画面初期化
fn main
// AlternateScreenへ移行
// raw モードに移行


# イベントハンドラ
// イベント処理
fn handle_events
// イベントハンドラ
   // match式でResultを処理
fn handle_key_events
// キー入力処理
   // Ctrl や SHIFT等のコンビネーションキー処理
      // Ctrlが押されている場合
         // Ctrl + qが入力されたら
   // 通常のキー入力処理
// 入力されたキーを画面出力


# 画面復旧
   // raw モードを解除
   // AlternateScreenから復帰
   // アプリケーション終了処理


# 画面出力(デバック系)
fn dbg_print_key_code
// 入力されたキーを画面出力Code language: PHP (php)

上記を踏まえてモジュール化したコードが下記となります(中身は省略)。

modというキーワードがモジュールの単位となります。

モジュールの中に更にモジュールを作成することも可能で、下記ではevent_handlerモジュールの中にtestモジュールを作っています。

また、event_handlerモジュールの中でEventHandler 型を定義しています。

structは構造体のキーワードでカスタム型としてユーザによって自由に定義することができます。

impl EventHandlerによってこのカスタム型に関連した関数やメソッドを定義しています。

第一引数がselfの場合、メソッドとして扱われます。そうでない場合は関数として動作します。

// TUI関連
mod tui {
   // 画面初期化
   pub fn init_tui(&self) -> io::Result<()> {
      Ok(())
   }
   // 画面復旧
   pub fn end_tui(&self) -> io::Result<()> {
      Ok(())
   }
}

// イベントハンドラ
mod event_handler {

   pub struct EventHandler {}

   impl EventHandler {
      // コンストラクタ
      pub fn new() -> Self {}
      // イベント処理
      fn handle_events(&mut self);
      // キー入力処理
      fn handle_key_events(&mut self);
      // イベントループ
      pub fn run(&mut self);
    }

   mod test {
      // 画面出力(デバック系)
      fn dbg_print_key_code() {}
   }
}
Code language: PHP (php)

モジュールとすることで、モジュールの中にある関数はデフォルトでプライベートな関数になります。

pubキーワードを付与することでモジュールの外部へ公開することが可能です。

こうすることによりRustコードとして見やすくなりメンテナンス性も上がります。

main関数は下記のようになりました。

// イベントハンドラの読み込み
use crate::event_handler::EventHandler;
// use self::tui;

// main 関数
fn main() {
    // 画面初期化
    let _ = tui::init_tui();

    // イベントハンドラ
    let mut event_handler: EventHandler = EventHandler::new();
    // イベント処理
    event_handler.run();

    // 画面復旧
    let _ = tui::end_tui();
}Code language: PHP (php)

GitHubにコードをアップロードしています。0.1.0バージョン

コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。

# Example
$ cargo run --example first_stepCode language: Bash (bash)
管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago