やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

dotnetというコマンド名では何をするのかわからない

 だって固有名詞だもん。いや、コマンドなら動詞にしろよ。

問題

 dotnetというコマンド名では何をするのかわからない。頭からパッと出てこない。

原因

dotnetは動詞でなく固有名詞だから

 以下のようなコマンド。これ、「何をするのか」がわかりにくい。コマンドなら最初は動詞にしてほしい。dotnetという固有名詞のせいで、何をするかわかりにくい。

dotnet new console -o プロジェクト名

 和訳すると、「dotnet は コンソール プロジェクトを 生成する」。ということ。

 いや、「誰がやるか」はどうでもいいんだよ。「何をするか」が重要なんだよ! 宣伝せず仕事しろks。最初にくるコマンド名は動詞にすべき。固有名詞ダメ絶対。

dotnetとかいう名前が意味不明

 .NET Framework.NETを英字だけで表現したらdotnetになる。たぶんそれ。

 なぜMicrosoft.NETという名前にしたかはわからない。たぶんなんかネットとか流行りだしてて最新のナウい感じを醸し出したかったんだろう。一昔前にイナックスとかガイナックスとかユニックスとか、なんとかックスって名前が流行ったみたいに。何ちゃら.comとか言って、とりあえず語尾に.comつけちゃう感じ。

 すごいわかりにくい。意味なんて無いんだろう。少なくともSDKは連想できない。固有名詞は知っているけど.NETという表記だし、.NETもよくわからん。そんな意味不明ワードをコマンド名にするとか、狂気の沙汰。

cscはマシ

 cscコマンドはまだマシ。おそらく「CSharp Compile」の略。

csc Hello.cs

 欲を言うなら以下の様にして欲しい。

compile Hello.cs
cpl Hello.cs

 拡張子に応じてそれぞれの言語に応じたコンパイラに渡す。

 コンパイルだけでなく実行までやるなら以下。

run Hello.cs

要望

 ソースコード生成においては以下のようなコマンドが望ましい。

gen cs
gen Hello.cs

 プロジェクトまで作るなら以下。

gen Hello.csproj
  • gen: generate。生成する
  • cs: CSharpのソースコード
    • -c: console形式の
  • *.ext: 拡張子に応じた言語と判断する

なぜ現状は要望と違うの?

 それぞれ別々の組織がコンパイラ等のSDKを実装しているせいで、統一的なインタフェースにはできない。バージョンによる差異も大きい。

理想の対策

 インタフェースは統一する。提供者ごとに、そのインタフェースに応じた機能を実装する。

 エンドユーザはインタフェースの機能から提供者のエンジンを選んでダウンロードする。実行時も選べる。どの提供者のどのSDKを使うか。

コマンドの方針

 コマンドは以下のような文法にして欲しい。

5W1H
1 どうする? 何をする?
2 何を? 何に対して?

 「どのように」するかはオプションで。

genコマンドを例に考えてみた

引数 意味
1 gen 生成する
2 cs C#ソースコード
(3) * 識別子。省略時はProgram
(4) * 型。class, abstract class, interface, struct, enum。省略時はclass
(-e) - Endpoint作成スイッチ。void Main(string[] args)メソッド。省略時は型=classで識別子=Programのとき作るが、それ以外なら作らない。もし識別子=Programのとき-eがあれば作らない(ON/OFF切替)。型がclass以外なら作らない。
(-p) SDKプロバイダ。dotnet/mono/fw Microsoft DotNet

 基本的にはすべてデフォルト値を設定する。デフォルト値にすると必要最小限のことができる想定で。

 この場合、csgenするpの設定は外部の設定ファイルで行うべき。コマンド最小限の原則に従うため。設定ファイルはドットファイル~/.genにする。

コマンド例

gen cs
gen cs Program
gen cs Program -e
gen cs Hello
gen cs Hello class
gen cs IBot interface
gen cs ABot abstract
gen cs Point struct
gen cs Message enum

ドットファイル

~/.gen

# -p
Providers.Paths=~/sdk/microsoft/*;~/sdk/provider2/*;
Providers.Default=dotnet

 SDK提供ファイルは以下の構造だと仮定する。

  • ~/sdk/
    • microsoft/
    • provider1/
      • product1/
      • product2/
    • provide2/
      • product1/
      • product2/

所感

 コードより文句・要望・妄想を書くほうが捗る……。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux