Elixir representer 정규화

Elixir representer가 솔루션에 적용하는 정규화에 대한 개요


Elixir representer는 여러 가지 정규화를 적용해요. 자세한 내용은 코드나 테스트 데이터를 참고해요.

주석과 문서 제거

모든 주석, 문서, 모듈 문서와 타입 문서가 제거돼요.

변경 전

defmodule Fake do
  @moduledoc """
  Fake module to demonstrate stuff
  """

  @doc "Not much to see here"
  def foo do
    # TODO: return bar
    nil
  end
end

변경 후

defmodule Fake do
  def foo do
    nil
  end
end

import 순서 정렬

모듈이나 함수 맨 위에 있는 import 문은 alias, use, require, import 순서로 정렬돼요.

변경 전

defmodule Fake do
  import D
  alias A.U.V
  use B
  alias A.{T, S}
  require C

  def foo do
    import Z
    alias X
    use Y
  end

  import NotTouched
  alias NotTouched
end

변경 후

defmodule Fake do
  alias A.{S, T}
  alias A.U.V
  use B
  require C
  import D

  def foo do
    alias X
    use Y
    import Z
  end

  import NotTouched
  alias NotTouched
end

코드 서식 지정

코드는 [mix code][mix-code]를 사용해 서식을 지정하며, do end 블록을 사용하도록 강제해요. 파이프 안의 모든 함수는 괄호를 붙여 써요. 타입은 괄호 없이 써요.

변경 전

defmodule    Fake   do
        @type foo() :: integer() | atom
def foo, do:    nil |> bar
end

변경 후

defmodule Fake do
  @type foo() :: integer | atom
  def foo do
    nil |> bar()
  end
end

식별자 정규화

식별자는 플레이스홀더 값으로 정규화돼요. 일부 특수 변수와 모듈 속성(_, @spec, __MODULE__ 등)은 대체되지 않아요. 맵, 구조체, 키워드 리스트의 키는 정규화되지 않아요.

변경 전

defmodule Fake do
  alias Fake, as: SuperFake
  @my_constant 42

  @impl true
  def foo(bar) when is_integer(bar) do
    bar + @my_constant
  end

  def foo(%{a: a} = bar) do
    %{bar | a: a + @my_constant}
  end

  def foo(_), do: nil
end

변경 후

defmodule Placeholder_1 do
  alias Placeholder_1, as: Placeholder_2
  @placeholder_6 42
  @impl true
  def placeholder_4(placeholder_5) when is_integer(placeholder_5) do
    placeholder_5 + @placeholder_6
  end

  def placeholder_4(%{a: placeholder_7} = placeholder_5) do
    %{placeholder_5 | a: placeholder_7 + @placeholder_6}
  end

  def placeholder_4(_) do
    nil
  end
end

맵과 구조체의 키 정렬

맵과 구조체의 키는 정렬돼요. 키워드 리스트의 키는 정렬되지 않아요.

변경 전

defmodule Fake do
  def foo do
    %MyStruct{z: 3, y: 2, x: 1}
    m = %{c: 3, a: 1, b: 2}
    %{m | b: 20, a: 10}
    [b: 2, a: 1]
  end
end

변경 후

defmodule Fake do
  def foo do
    %MyStruct{x: 1, y: 2, z: 3}
    placeholder_3 = %{a: 1, b: 2, c: 3}
    %{placeholder_3 | a: 10, b: 20}
    [b: 2, a: 1]
  end
end