LoginSignup
1
1

More than 5 years have passed since last update.

LINEのメッセージオブジェクトを整理したお話

Posted at

今回は新たな機能を実装したお話ではなく、リファクタリングしてちょっとプログラムをきれいにしました.
前回まで機能追加でソースの整理が追いついて無かったので,これからの開発を楽にするためにもしました.

主なリファクタリング内容

大きく変えたのはメッセージオブジェクト周りです.
メッセージオブジェクトとは、送信するメッセージの内容を表すJSONオブジェクトです(公式リファレンス).

今までのソース

送信する度にメッセージオブジェクトを作っては送信してました.
具体的には↓のように実装されてました.

            # メッセージオブジェクトの生成
            message = {
              type: 'text',
              text: sending_message
            }
            # 実際に送信
            client.reply_message(event['replyToken'], message)

            # メッセージオブジェクトの生成
            message = {
              type: 'location',
              title: place_name,
              address: address,
              latitude: lat,
              longitude: lng
            }
            # 実際に送信
            client.push_message(accepting_user_id, message)

これだと,何か送信する度に最低4行はメッセージオブジェクト生成のために使うことになり,コードが冗長になります(リファクタリング前は生成するだけで110行25行くらい使ってました).

これからのソース

なので,今後はメッセージオブジェクトを管理するクラスを専用に作って,そこで実際の生成をするようにしました.

下準備

今まで,メッセージオブジェクトはハッシュで設定していたので,まずはクラスをハッシュにしてくれるモジュールを作成します.
ついでに,ログ出力することを視野に入れて,Jsonも生成できるようにします.

messageObject.rb
module MessageObject
  def to_json()
    JSON.generate(self.to_hash)
  end

  def to_hash()
    hash = {}
    self.instance_variables.each do |t|
      key_name = t.to_s.gsub(/@/, '')
      hash[key_name] = self.send(key_name)
    end

    hash
  end
end

クラスの作成

そして,上をprependしたクラスを作成します.

text.rb
require 'json'
require './public/ruby/line_dto/message_object'

class Text
  prepend MessageObject
  attr_reader :type
  attr_accessor :text

  def initialize(text)
    @type = 'text'
    @text = text
  end
end
location.rb
require 'json'
require './public/ruby/line_dto/message_object'

class Location
  prepend MessageObject
  attr_reader :type
  attr_accessor :title, :address, :latitude, :longitude

  def initialize(title, address, lat, lng)
    @type = 'location'
    @title = title
    @address = address
    @latitude = lat
    @longitude = lng
  end
end

インスタンス生成時に引数を設定することで,送信する内容をセットする様にしています.
今のところ,一度インスタンスを生成したら,それを使いまわすイメージにしているので,@type以外はいつでも値をセットできる様になっています.

結果

作ったクラスを利用する様に,今までのソースにある部分を↓の様に修正しました.

            # メッセージオブジェクトの生成
            message = Text.new(sending_message)
            # 実際に送信
            client.reply_message(event['replyToken'], message.to_hash)

            # メッセージオブジェクトの生成
            location = Location.new(place_name, address, lat, lng)
            # 実際に送信
            client.push_message(accepting_user_id, location.to_hash)

とってもスッキリしました.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1