LoginSignup
0
1

More than 1 year has passed since last update.

配列の添え字が0から始まるのが嫌で1から始まる配列の系を新たに作ろうとする人への説明m9(^~^)

Last updated at Posted at 2022-09-18

疑似コード

var days = []string[nil, "mon", "tue", "wed", "thu", "fri", "sat", "sun"]
print(days[1])
// mon

配列の添え字が 0 から始まるのが嫌で、
配列の添え字を 1 から始めたくて、
配列に下駄を1つ履かせて 調整している人もいるかと思う

コンピューター・プログラム言語は、 序数 を使うケースは少ないが、
現に Lua スクリプトのように 配列の添え字が 1 から始まる 序数 の系も存在した

また、

📂
├── 📄素材1.png
├── 📄素材2.png
├── 📄素材3.png
└── 📄素材4.png

👆 素材ファイルを読み込み、

var files = []string["素材1.png", "素材2.png", "素材3.png", "素材4.png"]
print(days[2])
// 素材3.png

👆 配列の [2] 番の画像を差し替えたくて 素材2.png ファイルを更新して できたと思っていたら
変える必要もない配列の [1] 番の画像が指し替わっているという 錯誤 が起こることと思う。
錯誤とは、間違っていると思わず指示して、使われる者がルール通りに働いたら 思っているものと違うことをした、ということだ
 
これは、管理番号に 序数 を使っているが、配列は 基数 を使っていることによって起こる。

配列の添え字が0から始まるのが嫌で1から始まる配列の系を新たに作ろうとする人 というのは、
コンピューターは序数を使ってほしいと思っている人 だと言い換えることができる

なんで そんなことをしようとするかというと、 錯誤 するからだ

ほんとうに慎重であるならば

first を 1st、 second を 2nd、 third を 3rd、 fourth を 4th とするとき、
じゃあ 112 は 112st, 112nd, 112rd, 112th のうち どれか?

という問題がある。 これは n-th とか nth という名前で見かける
末尾の 2 に着目すれば 112nd としてしまいそうだが、
末尾の 12 に着目すれば 112th とするのが正しい。
122 なら 122nd となる

📂
├── 📄素材10th.png
├── 📄素材20th.png
├── 📄素材30th.png
└── 📄素材40th.png

👆 めんどくさいので 一の位が0になる呪い にかかることで全て th でいける

var files = []string[nil, "素材10th.png", "素材20th.png", "素材30th.png", "素材40th.png"]
print(days[20/10])
// 素材20th.png

こうすることで人間は 序数 を使っているし、コンピューターは 基数 を使う、
という意識付けができるが、 0th と3文字余分に打ち込むのが エコでないし
コンピューターが 10で割る のはイケてない、という見方もあるだろう

そこで、

📂
├── 📄素材1th.png
├── 📄素材2th.png
├── 📄素材3th.png
└── 📄素材4th.png

👆 英語の発音を無視し 全て th にし、

const geta = 1 // Japanese wooden clogs. Used to convert bases and ordinals.
var files = []string["素材1th.png", "素材2th.png", "素材3th.png", "素材4th.png"]
print(days[2 - geta]) // * `- geta` - 序数を基数に変換する
// 素材20th.png

👆 序数は - geta して基数に変換してから使うんだ、と念じる

var s = fmt.Sprintf("素材%dth.png", 2 + geta) // * `+ geta` - 基数を序数に変換する

👆 基数は + geta して序数に変換してから使うんだ、と念じる

この工夫により、

Pros

  • 数(すう)に親しくなる
  • スライスの [begin:end] に親しくなる
  • 配列を [0] から使える
  • for i:=1; i<len(array)+1; i++ { とか書かずに for i:=0; i<len(array); i++ { で書けるから 2文字短くなる
  • 配列の添え字が 1 から始まる特別な系を作らなくて済む

Cons

  • ファイル名が2文字長くなる。th を打鍵するのもめんどくさい
  • geta が 日本語の下駄のローマ字で 昭和のおっさん臭く かっこわるい

などと言える

どこで序数を使い、どこで基数を使うか?

以下のとき、序数は優れている

暗記で、そらんじられる

わたしたちは 序数 を暗記で そらんじられる。

いち、に、さん、 さんの次なんだっけ? ということがない。

アルファベットでも あいうえお でも序数として利用するのに向いているし、
松竹梅 と、3つしかない序数もある

pros

  • 漏れや、忘れ物がないか確認するために連番で点呼する。飛び番があると、誰かいないのではないか、何か抜けているのではないかと気づくことができる
  • 全て数え上げると嬉しい

cons

  • 配列の添え字が0から始まるのが嫌で1から始まる配列の系を新たに作ろうとする人が出てくる

リナンバリングしないことで嬉しいとき

出版した本のページ数などは、基本的に 変わらない ので引用元を示すのに使いやすい。
野球選手の背番号も たまに変わるが、そんなに頻繁に変わらないので グッズ はずっと使える。

それに比べ、

📂
├── 📄素材1.png  4/01
├── 📄素材2.png  4/01
├── 📄素材3.png  5/10
├── 📄素材4.png  4/02
└── 📄素材5.png  4/02

👆 「素材3.png を追加しました。 以前の 素材3.png 以降は数字が 1 ずれます」
という決定が飛んでくると

  • ファイルのリネーム作業
  • コードの改修
  • 引用している資料の改修
  • 周知

など工数が増え、その割にべつに大したメリットはないので、
リナンバリングしたいのなら 序数 を利用するのに向いてない。単に Id にすればよい

確かに 仕様書に 序数 が振ってあり ソートされていれば 読む人は嬉しいというのはあるが、
それは開発中にやることではない

とくに序数でありたくなければ基数を使う

基数は 序数を兼ねることができる

JSON に出力するとき どうするのか

{
    "value" : 1
}

👆 基数のつもりで格納しているのか、序数のつもりで格納しているのか、分からないケースがある

{
    "valueNth" : 1
}

👆 仕方がないので、 Nth を変数名につけたときは序数、それ以外は基数という マイ・ルール を決めておけばいいんじゃないか

0
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
0
1