Pythonで一つのファイルにクラスを複数定義するべきか?

一つのファイルに一つのクラスというルールが存在するjavaとは違いpython複数のクラスを一つのファイルに定義しても別に規約上は問題ない。

しかし、実践的にはどちらが適切か??

 

Pythonのファイルは"module"と呼ばれる

まず、基本事実としてPythonのファイルは"module"*1呼ばれ、我々はpythonで実装された各moduleをインポートすることで使用する*2module単位でテストしたり、moduleの入れ替えで機能を追加変更したりすることができるようにこころがけるべきだ。moduleは、できるだけ他のmoduleとの結合度を弱めて、独立性を高めることが望ましい。

すでに述べたようにpythonではルール上一つのモジュールに複数のclassを定義してよいのだから、一つのモジュールにいくつクラスを定義するかはそのコードの規模と機能を、上のモジュールの要件を満たすように決めれば良い。当然クラスごとに分割しすぎるとファイル数が見る見る間に多くなって管理しづらいだろう。

まとめ:

Pythonではまとめて管理されるべきクラスならひとつのファイルに定義しても良い。

 

 

Ref

[Python] One module per class, bad idea? - Grokbase

use modules to organize things in a way that makes sense to the code that uses your components.

make the import statements look good. 

 

*1:moduleを明示的にサポートする言語として、Ada、D言語、F言語、FORTRANPascal、ML、Modula-2、PythonRuby などがある。

*2:ディレクトリはpackageと呼ばれる)。moduleは再利用しやすいように心がける必要がある。すなわち、

きちんとシバンをつけるとfileコマンド でスクリプトの言語情報がでる

UNIX/Linuxではスクリプトの#!から始まる1行目でインタプリタを指定でき、これをシバン*1 と呼びます.

  

代表的なシバン

#!/bin/sh
#!/bin/bash

 

#!/usr/bin/perl

 

#!/usr/bin/env ruby

 

でここからが本題なのだが、Linuxのファイル識別コマンド file 

を用いるとシバンを書いてるとちゃんとどの言語のシェルスクリプトなのかを教えてくれる。

すなわち以下のような結果を返す

test.py: Python script, ASCII text executable

 

  • #!/usr/bin/pythonと書かなかった場合

test2.py: ASCII text
 

*1:shell-bang、sharp-bang

golangと並列化

 

golangの並行処理のサポート

Golangの特徴の一つとして並行処理のサポートが充実しておいることが挙げられる。よってgolangミドルウェアの開発などにも適しているとされている.

Goでは,goroutineという軽量スレッドを用いて処理を並行に実施し,同時に実行されているゴルーチンの間ではchanelという機能でデータをやりとりするしくみが備わっている*1

www.slideshare.net

 

 

理解すべき概念 : 

  • gorutine ( 名前はcoroutineのもじり )*2
  • channel : 処理の競合を回避。データのやりとりをするときに使用(MPIのsend recive みたいなものか?)

                 select : 複数のチャネルから同時に受信  

 特筆すべき注意点

  • goroutineを作成するコストは極めて小さい*3

 

    Frequently Asked Questions (FAQ) - The Go Programming Language

*1:並行処理を行うプログラムの相互作用パターンを記述するためのCSP(Communicating Sequential Processes)を採用している.

*2:coroutineとの違いとしては

  • 1. goroutineは並列化の概念を含む。coroutineは並列化とは関係のない概念である。
  • 2 . goroutineはchanelと呼ばれる機能によって互いに通信する。一方coroutine 同士の通信にはyield やresumeと呼ばれる演算子を利用する

    *3: goroutineは、マルチコアCPUで同時実行可能であり、Javaのスレッドなどに比べリソース消費が極めて小さい。