6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2023

Day 25

【ロバストPythonを読んた感想】ロバストなコードをささえる機能は言語を超えた共通点がある

Posted at

はじめに

今年発売されたPythonの本で、よかったと思った本です。

この本は、ロバストなコードを書くにはどうしたらいいか。Pythonに最近導入された機能も含めて説明されています。Clean Code アジャイルソフトウェア達人も本文で引用されている部分があり、クリーンコードについても学べます。

Python2のころからPythonは使用していますが、Python3.3くらいの知識で止まっていたので、Python固有の知識を得る事ができました。
特に、データクラスやABC(抽象基底クラス)は、必見だとおもいました。

この二点をおさらいしてみます。

データークラス

データークラスは、3.7で導入されました

image.png

Pythonでは基本的にClassを作っていろいろなデータ構造を表します。このDataClassが登場するまでは、ユーザ定義の型が必要な場合は、Classを作って__init__()に値をself.xxxにコピーするコードを書く必要がありました。これが簡略化され書きやすくなりました。

データークラスはデコレータとして実装されていていています。
classを使って記述しますが、データークラスとクラスの目的には違いがあります。

  • データクラスは単にデータを保存する事が目的
  • クラスは、データの一貫性を担保必要があるデータを保持する事が目的

ロバストPythonでの説明も9章のデータクラスの説明があり、そのあと10章クラスの説明になっています。

インターフェース

Python 3.6で、abc(抽象基底クラス)が導入されました。これを使ってInterfaceの定義ができるようになりました。
継承を使わなくても(継承の関係がないクラス同士でも)Interfaceの定義ができます。

継承は不要

オブジェクト指向の言語では、基底クラスを作って継承したクラスを作る方法で同じメソットをもつクラスをつくり、共通の使い方をするような使い方が基本的な使い方の一つだったとおもいます。
しかし、達人プログラマー 31 インヘリタンス(相続)税で使ってはいけないと書かれています。
abc(抽象基底クラス)が3.7で追加されたのも継承の問題点を補う為だと思いました。

継承を使う必要はなくなります。

Elixirとの比較

Elixirは2014年にリリースされた比較的新しい言語です。
関数型言語で、オブジェクト指向ではないので、Pythonの機能と単純には比較できませんが、データクラスやInterfaceに当たるもがあります。

struct

defstructを使って、ユーザ独自のデータ構造を定義できます。これは、Pythonのdataclassと同じようなものだと思います。
module毎に定義できます。
moduleには、関数も定義することができ、selfのないclassみたいな感じです。

defstructの例
defmodule User do
  defstruct name: nil, age: nil

  def print(user) do
    IO.puts("name=#{user.name} age=#{user.age}")
  end
end

使い方

iex(1)> mydata = %User{name: "taro", age: 30}
%User{name: "taro", age: 30}
iex(2)> User.print(mydata)
name=taro age=30
:ok
iex(3)>

protocol

Elixirでは、モジュールに共通のインターフェースを持たせたい場合、protocolを使います。
Pythonのabc(抽象基底クラス)のような役割です。
詳しい説明は、elixirschool.comなどを参照してください。
親子関係のないmodule同士で、使う事ができます。

classにあたるものは?

Pythonの場合、Classを定義してデータと操作する関数を書きます。
Elixirの場合は、オブジェクト指向ではないので、classはありません。
しかし、データと関数の管理を手助けをする仕組みがあります。

  • moduleには構造体と関数を書けるので、moduleにまとめる事ができる。
  • パターンマッチによりデータの型と実行する関数を紐づけることができる。

このような仕組みがあるので、ElixirでのプログラミングでClassが無くて困ったということはありません。

ロバストなコードの追求

3.6,3.7でプログラミングコミュニティが進めてきたPythonの追加機能は、Elixirとも共通点をもったものでした。ロバストなコードに必要な機能は、共通があるのだと感じました。

使用するプログラミング言語は、いろいろな要件に依存するので選べない場合も多いですが、このように、言語を超えた、ロバストなコードに対する考えを身に着け、それぞれの言語で活用する事が大切かと思いました。

Pythonを使っている方も、他の言語の言語を学んでみると共通点がわかり勉強になると思います。
Elixirは学びやすく、応用範囲も広いのでお勧めです。

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?