Scala実践「Either型を使ってimmutable(不変)なコードを書こう!」


はじめに

みなさんこんにちは、プロダクト開発本部の亀梨です。
普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う
統合プラットフォームの開発を担当しています。

Scalaでイケてるコードを書きたい!

背景

わたくしはDACに入社してからScalaを書くことになりました。それまでは以前の会社で3年ほどPHPを書いてきて他のサーバーサイド言語は知らなかったので、
スクリプト言語からコンパイル言語への移行には最初は非常に苦労しました。…いや、今でも苦労しています(笑)。

さて今回はScalaのEither型を取り上げます。基本的な使い方と具体的な例を挙げて実践に活用出来るヒントになればと思います。
ちなみに過去にScala関連で書いた記事は以下となります。参考まで。

  1. Scala入門 準備編「開発環境構築」
  2. Scala入門 基礎編「Scalaの書き方を理解しよう」

イケてるコードの定義

Scalaの特徴の一つとして「immutable(不変)」なコードが簡潔かつ副作用が無いと推奨されています。
そして今回のケースとしては、いかにimmutableにコードを書けるかがイケてるかどうかの定義とします。
このあたりはScalaビギナーが通る最初の関門ではないでしょうか。

Either型とは

それでははじめにEither型について触れておきましょう。
Either型はその名の通り「2つのうちどちらか一方」という値を表します。この特徴のため、主にエラー処理で「成功時の値or失敗時の値」として扱われることが多いです。EitherはRightとLeftという2つの値を持ちます。REPLでコードを書いてみましょう。

一般的にEitherを使う場合、Left値をエラー値、Right値を正常な値とみなすことが多いです。
英語の”right”が正しいという意味なので、それにかけているという説があります。

イケてるコード具体例

それではEither型の基本に触れた上で早速コードの具体例を書いていきます。
前提として、

  • とある商品IDリストを格納している配列がある
  • この商品ID一つ一つを元にDBにクエリを投げて、この商品が有効であるかを確認→有効であれば商品情報を取得する
  • 商品情報を改めて配列に格納する
  • 有効な商品に対してなんらかの処理を行う

という処理を行うこととします。

【びふぉー】mutable(可変)でイケてないコード

まずはEither型を使わない場合のコードです。

はい、こんな感じです。このコードだと予め作成しておいた空の配列に有効な商品情報を次々と追加していく形になるので、
itemListがmutable(可変)となり副作用を伴います。。。
まぁこの書き方でも悪くはないと思うのですが、せっかくScalaで書くならその特徴を生かしたいですよね。

【あふたー】immutable(不変)でイケてるコード

では次にEither型を使ってリファクタリングしたコードです。

はい、これでEither型で関数型を使ったコードとなります。
有効な商品情報と無効な商品を一度に配列に格納でき後から追加ができないようになるため、
immutable(不変)で副作用のないコードとなります。あと最後のif文でエラー処理か正常の処理かを分岐しているため可読性も増しているかと思います。

あと個人的にimmutableなコードが書けたときになんとも言えない高揚感と興奮を覚えます(笑)。

まとめ

というわけで簡単ではありますがEither型の具体例を紹介いたしました。
わたくしもまだまだScalaは勉強中でビギナー感が抜けない状態ではありますが、だからこそ気づきも多いかと思うので
またなにか良い具体例があればここで共有できればと思います。

それではまた!


DACエンジニア採用情報

  関連記事

ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …

【未経験からのRuby on Rails – 第2回】Rubyのプログラムを書いてみる(Mac)

こんにちは。新卒1年目のmatsuariです。 前回はRubyとは何か、簡単にご紹介をしましたが、 今回は実際にRubyファイルを作成して、プログラムを書いてみるところまでご紹介していけたらと思います。 Mac環境のプログラミング初心者向けです。 はじめに、Rubyのプログラムを書くためのファイルを …

GoogleスプレッドシートからTreasureDataへデータを取り込む

AudienceOneの開発を担当しています。skryoです。 またまたTreasureDataネタですが、今回はGoogleスプレッドシートからGoogleAppsScriptを使ってTreasureDataへデータを取り込む手順を紹介したいと思います。 なぜ? Googleスプレッドシート上でマ …

no image
【小ネタ】Javascriptのconsoleオブジェクトをもっと便利に使う方法

すごく便利なconsoleオブジェクトですが、ブラウザによってサポートされているメソッドが なかったり、そもそもconsoleオブジェクトが使えなかったりと、たまに不便だったりします。 そんなときによく使う便利なコード。 [code language=”javascript” …

no image
AWSにRailsアプリをデプロイする(公開編)

次にデプロイするため“aws rails デプロイ”でググってみるとunicorn、nginxというキーワードがでてくるので とりあえずこれを設定していきます。   アプリのsecret_key_baseの設定 [crayon-5ce7a49e36923844797 …

Selenium × PHP でテスト自動化!【環境構築編】

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 テスト自動化の背景 わたくしが担当するXmediaOneでは品質担保のために①コードベ …

Bootstrapのモーダル機能で多重表示する際に解決しなければならない2つの問題

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発・保守を担当しています。 エンジニアの皆さん、デザインってどうしてます? わたくしはプライベートでとあるW …

no image
【未経験からのRuby on Rails – 第1回】楽しく書けるプログラミング言語 “Ruby” とは

こんにちは、はじめまして。新卒1年目のmatsuari(女子)です。 この度、Rubyの勉強を始めることになりまして、 まずはたくさんあるプログラミング言語の中で、なぜ自分がRubyを学ぶのか? しっかりと把握した上で学習に取り組んでいきたいと考え、『Rubyとは何か?』調べました。 超基礎的なこと …

(社内新卒・PHPビギナー向け)MacでPHP7開発環境を構築しよう!

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 えっ!?新卒のプログラミング研修はPHPで行われるって?!俺の得意言語やないか!! は …

Scala番外編「Boxに保存したファイルをBox APIを使ってダウンロードしよう!」

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Box APIを使う背景・目的 DACはメディアレップです メディアレップとは、インタ …