かとじゅんの技術日誌

技術の話をするところ

Rustでブロッキングキューを実装する

Rustでブロッキングキューを実装した話。これはRustのカレンダー | Advent Calendar 2023 - Qiitaの22日目の記事です。

ブロッキングキューはご存じだろうか。(えっ…スレッドはブロックしたくない…と思った人は最後まで読むとよいかも)

Javaにはあります。

docs.oracle.com

要素の取得時にキューが空でなくなるまで待機したり、要素の格納時にキュー内に空きが生じるまで待機する操作を追加でサポートしたりするQueueです。

これはRustの標準にはない。今回はブロッキングキューを実装してみる。

「そういえば、ブロッキングキューが欲しい!」と思ったときに、ぜひこのブログ記事を思い出してほしい。

続きを読む

Scala 3でデータ指向プログラミングは可能か

Scala 3におけるデータ指向プログラミング(以下DOP)について深掘りする。久々にScalaの話題を取り上げるが、これはScala Advent Calendar 2023の14日目の内容でもある。

早速だけど、DOPの基本原則は意外とシンプルだ。

  1. コード(動作)をデータから切り離す
  2. データを汎用的なデータ構造で表現する
  3. データをイミュータブル(不変)として扱う
  4. データスキーマをデータ表現から切り離す

イミュータブルなデータは採用することは多いと思うが、これをそのまま実践している人はどのくらいいるだろうか。Scalaではクラス中心の関数型プログラミングが主流だと思うし、私もそうしている。

DOPの詳細は下記の本(以下DOP本)を参照してほしい。

続きを読む

メモ:値オブジェクトの定義と差異について

「値オブジェクト」の定義について不勉強だったので「DDDの値オブジェクト」の定義とDDD以外の「値オブジェクト」との違いについて、改めて関連書籍を読み直し整理してみました。

すごい長いし細かいので他人に読ませるような記事ではなく、自分のために書いたメモです。

もし読むなら興味がある人だけで。

続きを読む

Re: Re: ドメイン固有型(値オブジェクト含む)を再考する

kumagi.hatenablog.com

こちらの記事への反応です。

違う。値オブジェクトとはID以外で等価判定をするオブジェクトの事であって、RubyのHash、Pythonのdict、C++のstd::unordered_setすらも値によって等価判定を行うのでこれらは値オブジェクトであるがドメイン固有型ではない

RubyのHash、Pythonのdict、C++のstd::unordered_setは、アプリケーションのドメインからみるとインフラストラクチャに見えるかもしれません。

しかし、RubyのHash、Pythonのdict、C++のstd::unordered_set であっても、解決する問題領域(ドメイン)があります。なので、そのドメインにとっては、ドメイン固有型(=ドメインオブジェクト)である、と解釈しています。(ドメイン固有型の”固有”が紛らわしかったかもしれませんが…)

型クラスを既存の値型にバリデーションを足すために使う人を見たことが無いけれど(やりたいことは素直なのだから素直にif文やクラスを作るほうがまだわかる)Scalaだとよくある文化なのかしら?

単にバリデーションを追加するためだけにこういうことをするわけではないです。ドメインモデルに実装を対応づけるために定義するという意味でした。

コダックさんのツイートには返信済みでしたが、こういう解釈をしています。

追記: 5/19 17:13

ドメイン固有型(値オブジェクト含む)を再考する

Value Objectが盛り上がっているらしい。

Value Objectについて整理しよう - Software Transactional Memo

Value Objectの説明に異論がないものの、主題はValue Object Obsessionのほうですよね。

こちらも聞いてみた。

fukabori.fm

よい機会なので、よくわかっているつもりの、値オブジェクトというかドメイン固有型について再考してみよう。

続きを読む

Rustを使ってスケーラブルなプログラムを書く方法

この記事はRust Advent Calendar 2021の12/24日の記事です。

仕事ではScalaを使っていますが、趣味のプログラミングではRustで書いたものが増えました。Rustは楽しいですね。

今回は、Rustでオブジェクト指向プログラミングに関数型デザインを導入することで、スケーラブルなプログラムを書く方法(スケーラブル・プログラミング)について書きます。

続きを読む