業界システム開発で変数名やら関数名を日本語にしたら
専門業界のシステム開発では、英語がどんなに得意でも大学で該当業種の英語の論文を読む経験をしない限り「設計書」から「プログラムコード」に落とすには専門の和英辞書が欠かせない。現実にはローマ字でそのまま日本語を表現しているコードも多い。バブル期には「24時間働けますか」を合い言葉にせっせとデータベースにプログラムで使いたい専門用語を辞書登録する金融システム開発フェーズもあった。
名前が正しいかをレビューする
「24時間働けますか」が「社畜」「ブラック企業」「やり甲斐詐欺」などの言葉で駆逐され「あたりまえ」を見直さなければならない現代。クライアントが外資系ならともかく外注プログラマーが業界専門和英辞書をせっせと調べる時間はなくすべき。「日本語で書いちゃえ」という発想は誰でも考えること。ところが未だにその風潮が見えないのは「誤字脱字誤用」問題である。プラグラムは正常に動作するけどコードに書かれている名前が間違っていると指摘されるのを嫌忌していることが想像できる。それでも僕はプログラムの品質やメンテナンス性を考慮するとクライアントと共にコードレビューでコード内の誤字脱字をレビューするべきだと考えている。
オープンソースは日本語NG
個人的に作ったプログラムソースをGITなどで管理するときに特に隠したいこともなく見たければ誰でも見ていいよと考えている。実は自慢したいという気持ちもある。とはいえ外国の人に日本語を見せるのは不親切だとも思う。僕自身もプログラムコードにアラビア語がでてきたら手も足も出ない。そこでコーディングでは処理対象の名前を日本語で書いてサクッと書き上げ完成品が自慢できそうだったら英語に直して公開することにした。そしてそのためのプログラムを作成した。
日本語プログラムコードを英語にする
速攻で「日本語プログラムコードを英語にするプログラム」を作った。そして公開するためにそれ自身を英語にしてみた。その結果が以下のコード。日本語が何処にもなく何かしらの部品群であることはわかるものの、それぞれの意味機能については開目と言ったところだろう。
これらの部品を使って基点ディレクトリからすべてのプログラムファイルを英語化できるようにアプリを組んでみた。だだこれをオンラインサービス公開しても上がってきたプログラムコードのプライバシーを担保しきれないので画面にプログラムコードをコピペして英語化を試すオンラインサービスを作成した。これなら実務で使えそうもないので安心。文末にURLを貼っておくので試してみてもらえるとありがたい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
<?php define("markChar","!#$%&()=~|^-[{]}@`:*;+/?.>,<\r\n\t "); define("quautation", "'"); define("daoubleQuautation", '"'); define("endCommentMarkPHP", '*/'); define("globalizeFolderName", "global"); define("globalizeMapFileName", "gmap.inf"); define("japaneseCodeInputTet", "jpcode"); define("dictionarySession", "gpdic"); function fineSourceFileList($projectPath) { $fileList = findFile($projectPath); $sourceFileList = []; foreach ($fileList as $filePath) { $fileExtention =pathinfo($filePath, PATHINFO_EXTENSION); switch ($fileExtention) { case 'php': case 'html': case 'js': case 'css': $sourceFileList[] = $filePath; } } return $sourceFileList; } function isJapaneseExists ($str) { if (strlen($str) != mb_strlen($str, 'utf8')) { return true; } return false; } function skipMarkChar ($text, $startPosition) { $endPositon = mb_strlen($text); while($startPosition < $endPositon) { $char = mb_substr($text, $startPosition, 1); if (mb_strpos(markChar, $char) === false) { break; } else if ($char == quautation) { $startPosition = skipConstMarkChar($text, $startPosition+1, quautation); } else if ($char == daoubleQuautation) { $startPosition = skipConstMarkChar($text, $startPosition+1, daoubleQuautation); } else if ($char == '/') { if (mb_substr($text,$startPosition-1, 1) == '/') { $startPosition = skipComment($text, $startPosition+1, "\n"); } } else if ($char == '*') { if (mb_substr($text,$startPosition-1, 1) == '/') { $startPosition = skipComment($text, $startPosition+1, '*/'); } } else if ($char == '-') { if (mb_substr($text,$startPosition-1, 1) == '-') { if (mb_substr($text,$startPosition-2, 1) == '!') { if (mb_substr($text,$startPosition-3, 1) == '<') { $startPosition = skipComment($text, $startPosition+1, '-->'); } } } } $startPosition ++; } return $startPosition; } function skipComment($text, $startPosition, $endCommentMarkChar='*/') { $endCommentPosition = mb_strpos($text, $endCommentMarkChar, $startPosition); if ($endCommentPosition === false) { return mb_strlen($text); } return $endCommentPosition + mb_strlen($endCommentMarkChar); } function skipConstMarkChar ($text, $startPosition, $constMarkChar='"') { $endPositon = mb_strlen($text); while($startPosition < $endPositon) { $char = mb_substr($text,$startPosition, 1); if ($char == $constMarkChar) { break; } $startPosition ++; } return $startPosition; } function skipUntilMarkChar($text, $startPosition) { $endPositon = mb_strlen($text); while($startPosition < $endPositon) { $char = mb_substr($text, $startPosition, 1); if (mb_strpos(markChar, $char) !== false) { break; } $startPosition ++; } return $startPosition; } function deleteConstMark($word) { $startChar = mb_substr($word,0, 1); switch ($startChar) { case quautation: case daoubleQuautation: $word = str_replace($startChar, '', $word); } $endChar = mb_substr($word, -1); switch ($endChar) { case quautation: case daoubleQuautation: $word = str_replace($endChar, '', $word); } return $word; } function getJapaneseNameList ($sourceFilePath, &$japaniseNameList) { if ($sourceFilePath == false) { $sourceText = $_SESSION[japaneseCodeInputTet]; } else { $sourceText = file_get_contents($sourceFilePath); } $startPosition = 0; $endPositon = mb_strlen($sourceText); while ($startPosition < $endPositon) { $startWordPosition = skipMarkChar($sourceText, $startPosition); $endWordPosition = skipUntilMarkChar($sourceText, $startWordPosition); $stringLength = $endWordPosition - $startWordPosition; $word = mb_substr($sourceText, $startWordPosition, $stringLength); $word = deleteConstMark($word); if (isJapaneseExists($word)) { $japaniseNameList[$word] = 0; } $startPosition = $endWordPosition; } } function findEnglish($japanese){ if (!empty($_SESSION[dictionarySession][$japanese])) { return $_SESSION[dictionarySession][$japanese]; } return ""; } function margGlobalizeMap($globalizeMap) { if (!empty( $globalizeMap )){ if (empty($_SESSION[dictionarySession])) { $_SESSION[dictionarySession] = []; } foreach($globalizeMap as $japanese=>$english) { $_SESSION[dictionarySession][$japanese] = $english; } } } function filePutGlobalizeMap($globalizeMap, $globalizeSourceBaseFolder) { margGlobalizeMap($globalizeMap); $globalizeMapFilePath = $globalizeSourceBaseFolder.'/'.globalizeMapFileName; file_put_contents($globalizeMapFilePath, serialize($_SESSION[dictionarySession])); } function fileGetGlobalizeMap($globalizeSourceBaseFolder) { $globalizeMap = []; if ( $globalizeSourceBaseFolder == false) { return $_SESSION[dictionarySession]; } else { $globalizeMapFilePath = $globalizeSourceBaseFolder.'/'.globalizeMapFileName; if (file_exists($globalizeMapFilePath)) { $globalizeMap = unserialize(file_get_contents($globalizeMapFilePath)); } } return $globalizeMap; } function isNewGlobarize($projectFilePath) { $projectFilePath = str_replace("\\", '/', $projectFilePath); $devidedPath = explode('/', $projectFilePath); $endPathName = $devidedPath[count($devidedPath) - 1]; if ($endPathName == globalizeFolderName) { return false ; } return true; } function makeGlobalizeMap() { $globalizeMap = []; foreach ($_REQUEST as $key=>$value) { if (isJapaneseExists($key)) { if (!empty($value)) { $globalizeMap[$key] = $value; } } } return $globalizeMap; } function filePutGlobalizeSource($sourceFilePath, $globalizeMap, $globalizeSourceBaseFolder){ $sourceCode = file_get_contents($sourceFilePath); $japaneseList = array_keys($globalizeMap); array_multisort(array_map("mb_strlen", $japaneseList), SORT_DESC, $japaneseList); foreach ($japaneseList as $japanese) { $sourceCode = str_replace($japanese, $globalizeMap[$japanese], $sourceCode); } $sourceFileName = basename($sourceFilePath); if (dirname($sourceFilePath) == $globalizeSourceBaseFolder) { $globalizeSourceFilePath = $sourceFilePath; } else { $globalizeSourceFilePath = str_replace(dirname($sourceFilePath), $globalizeSourceBaseFolder,$sourceFilePath); } if (!file_exists(dirname($globalizeSourceFilePath))){ mkdir(dirname($globalizeSourceFilePath), 0777, true); } file_put_contents($globalizeSourceFilePath, $sourceCode); } function changeGlobalizeText($sourceCode, $globalizeMap) { $japaneseList = array_keys($globalizeMap); array_multisort(array_map("mb_strlen", $japaneseList), SORT_DESC, $japaneseList); foreach ($japaneseList as $japanese) { $sourceCode = str_replace($japanese, $globalizeMap[$japanese], $sourceCode); } return $sourceCode; } unction findFile(string $dir, bool $realpath = false) { $files = array(); $files = []; foreach ((new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS))) as $file) { /** @var SplFileInfo $file */ if ($realpath) { $files[] = $file->getRealPath(); } else { $files[] = $file->getPathname(); } } return $files; } ?> |
辞書化作業の折り合いについて
このオンラインサービスは、日本語で書かれたプログラムコードから日本語名を抜き出して一覧を表示する。そして「英語名を自分で入力しろ」と言ってくる。コレはコレで面倒。とはいえオープンソースにする以上は正しい英語で書いた方が自慢にもなる。アルゴリズムを考えるときにスペルを気にしながらコーディングするかと思えば後でやったほうがイイのは間違いない。
自分の変換辞書を育てる機能について(グローバライズ辞書)
とはいえ毎回毎回同じ作業を繰り返すのはストレスこの上ない。そこで辞書を再利用できるようにした。
下が返還後に出てくる辞書データ。サービスページでは「グローバライズ辞書」と呼んでいる。これをオンラインサービス画面の「グローバライズ辞書」にコピペすれば同じ日本語については入力しなくてもよくなる。そして最新の辞書が再び画面に出てくるのでメモ帳などに保存して再利用すれば辞書が育っていく。
1 |
a:58:{s:57:"グローバライズソース出力基点フォルダー";s:25:"globalizeSourceBaseFolder";s:54:"グローバライズソース出力ファイルパス";s:23:"globalizeSourceFilePath";s:51:"グローバライズマップ保存ファイル名";s:20:"globalizeMapFileName";s:48:"グローバライズマップファイルパス";s:20:"globalizeMapFilePath";s:39:"グローバライズテキスト変換";s:19:"changeGlobalizeText";s:39:"グローバライズフォルダー名";s:19:"globalizeFolderName";s:39:"グローバライズマップマージ";s:16:"margGlobalizeMap";s:36:"グローバライズソース出力";s:22:"filePutGlobalizeSource";s:36:"グローバライズマップ作成";s:16:"makeGlobalizeMap";s:36:"グローバライズマップ保存";s:19:"filePutGlobalizeMap";s:36:"グローバライズマップ読込";s:19:"fileGetGlobalizeMap";s:36:"プロジェクトファイルパス";s:15:"projectFilePath";s:36:"日本語コード入力テキスト";s:20:"japaneseCodeInputTet";s:36:"日本語文字が含まれている";s:16:"isJapaneseExists";s:27:"コメント終了文字PHP";s:17:"endCommentMarkPHP";s:33:"ダブルクォーテーション";s:17:"daoubleQuautation";s:33:"区切り文字までスキップ";s:17:"skipUntilMarkChar";s:33:"新規グローバライズ判定";s:14:"isNewGlobarize";s:30:"グローバライズマップ";s:12:"globalizeMap";s:27:"コメント終了文字列";s:18:"endCommentMarkChar";s:27:"ソースファイルパス";s:14:"sourceFilePath";s:27:"ソースファイル一覧";s:14:"sourceFileList";s:27:"ソースファイル検索";s:18:"fineSourceFileList";s:27:"区切り文字スキップ";s:12:"skipMarkChar";s:27:"定数指定マーク除去";s:15:"deleteConstMark";s:27:"定数文字列スキップ";s:17:"skipConstMarkChar";s:24:"クォーテーション";s:10:"quautation";s:24:"コメントスキップ";s:11:"skipComment";s:24:"コメント終了位置";s:18:"endCommentPosition";s:24:"ソースファイル名";s:14:"sourceFileName";s:24:"プロジェクトパス";s:11:"projectPath";s:24:"日本語名一覧取得";s:19:"getJapaneseNameList";s:21:"ソーステキスト";s:10:"sourceText";s:21:"ファイル拡張子";s:13:"fileExtention";s:21:"辞書セッション";s:17:"dictionarySession";s:18:"ソースコード";s:10:"sourceCode";s:18:"パス分割結果";s:11:"devidedPath";s:18:"ファイルパス";s:8:"filePath";s:18:"ファイル一覧";s:8:"fileList";s:18:"ファイル検索";s:8:"findFile";s:18:"単語終了位置";s:15:"endWordPosition";s:18:"単語開始位置";s:17:"startWordPosition";s:18:"定数指定文字";s:13:"constMarkChar";s:18:"日本語名一覧";s:16:"japaniseNameList";s:15:"区切り文字";s:8:"markChar";s:15:"日本語一覧";s:12:"japaneseList";s:15:"最終パス名";s:11:"endPathName";s:12:"テキスト";s:4:"text";s:12:"先頭文字";s:9:"startChar";s:12:"最終位置";s:10:"endPositon";s:12:"最終文字";s:7:"endChar";s:12:"英語検索";s:11:"findEnglish";s:12:"開始位置";s:13:"startPosition";s:9:"文字数";s:12:"stringLength";s:9:"日本語";s:8:"japanese";s:6:"単語";s:4:"word";s:6:"文字";s:4:"char";s:6:"英語";s:7:"english";} |
オリジナルの日本語プログラムコードがコレ
下が自分が打ち込んだプログラムコード。そしてサーバで動いている。英語のコードは動作確認だけした。名前の打ち込みミスは日本語なので見てすぐわかる。「ファイル検索」という関数は某PHPサイトから中身をコピペしたので日本語は入っていない。「日本語文字が含まれている」という関数も名前のセンスが悪い上に引数に$strなどと日和った変数名を使ってしまい後悔至極。このコードと「グローバライズ辞書」を文末に記したオンラインサービスページにコピペすれば英語化する作業を簡単に試すことができるので是非試してみてほしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
<?php define("区切り文字","!#$%&()=~|^-[{]}@`:*;+/?.>,<\r\n\t "); // 定数文字列対応版 define("クォーテーション", "'"); define("ダブルクォーテーション", '"'); define("コメント終了文字PHP", '*/'); define("グローバライズフォルダー名", "global"); define("グローバライズマップ保存ファイル名", "gmap.inf"); define("日本語コード入力テキスト", "jpcode"); define("辞書セッション", "gpdic"); function ファイル検索(string $dir, bool $realpath = false) { $files = array(); $files = []; foreach ((new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS))) as $file) { /** @var SplFileInfo $file */ if ($realpath) { $files[] = $file->getRealPath(); } else { $files[] = $file->getPathname(); } } return $files; } function ソースファイル検索($プロジェクトパス) { $ファイル一覧 = ファイル検索($プロジェクトパス); $ソースファイル一覧 = []; foreach ($ファイル一覧 as $ファイルパス) { $ファイル拡張子 =pathinfo($ファイルパス, PATHINFO_EXTENSION); switch ($ファイル拡張子) { case 'php': case 'html': case 'js': case 'css': $ソースファイル一覧[] = $ファイルパス; } } return $ソースファイル一覧; } function 日本語文字が含まれている ($str) { if (strlen($str) != mb_strlen($str, 'utf8')) { return true; } return false; } function 区切り文字スキップ ($テキスト, $開始位置) { $最終位置 = mb_strlen($テキスト); while($開始位置 < $最終位置) { $文字 = mb_substr($テキスト, $開始位置, 1); if (mb_strpos(区切り文字, $文字) === false) { break; } else if ($文字 == クォーテーション) { $開始位置 = 定数文字列スキップ($テキスト, $開始位置+1, クォーテーション); } else if ($文字 == ダブルクォーテーション) { $開始位置 = 定数文字列スキップ($テキスト, $開始位置+1, ダブルクォーテーション); } else if ($文字 == '/') { if (mb_substr($テキスト,$開始位置-1, 1) == '/') { $開始位置 = コメントスキップ($テキスト, $開始位置+1, "\n"); } } else if ($文字 == '*') { if (mb_substr($テキスト,$開始位置-1, 1) == '/') { $開始位置 = コメントスキップ($テキスト, $開始位置+1, '*/'); } } else if ($文字 == '-') { if (mb_substr($テキスト,$開始位置-1, 1) == '-') { if (mb_substr($テキスト,$開始位置-2, 1) == '!') { if (mb_substr($テキスト,$開始位置-3, 1) == '<') { $開始位置 = コメントスキップ($テキスト, $開始位置+1, '-->'); } } } } $開始位置 ++; } return $開始位置; } function コメントスキップ($テキスト, $開始位置, $コメント終了文字列='*/') { $コメント終了位置 = mb_strpos($テキスト, $コメント終了文字列, $開始位置); if ($コメント終了位置 === false) { return mb_strlen($テキスト); } return $コメント終了位置 + mb_strlen($コメント終了文字列); } function 定数文字列スキップ ($テキスト, $開始位置, $定数指定文字='"') { $最終位置 = mb_strlen($テキスト); while($開始位置 < $最終位置) { $文字 = mb_substr($テキスト,$開始位置, 1); if ($文字 == $定数指定文字) { break; } $開始位置 ++; } return $開始位置; } function 区切り文字までスキップ($テキスト, $開始位置) { $最終位置 = mb_strlen($テキスト); while($開始位置 < $最終位置) { $文字 = mb_substr($テキスト, $開始位置, 1); if (mb_strpos(区切り文字, $文字) !== false) { break; } $開始位置 ++; } return $開始位置; } function 定数指定マーク除去($単語) { $先頭文字 = mb_substr($単語,0, 1); switch ($先頭文字) { case クォーテーション: case ダブルクォーテーション: $単語 = str_replace($先頭文字, '', $単語); } $最終文字 = mb_substr($単語, -1); switch ($最終文字) { case クォーテーション: case ダブルクォーテーション: $単語 = str_replace($最終文字, '', $単語); } return $単語; } function 日本語名一覧取得 ($ソースファイルパス, &$日本語名一覧) { if ($ソースファイルパス == false) { $ソーステキスト = $_SESSION[日本語コード入力テキスト]; } else { $ソーステキスト = file_get_contents($ソースファイルパス); } $開始位置 = 0; $最終位置 = mb_strlen($ソーステキスト); while ($開始位置 < $最終位置) { $単語開始位置 = 区切り文字スキップ($ソーステキスト, $開始位置); $単語終了位置 = 区切り文字までスキップ($ソーステキスト, $単語開始位置); $文字数 = $単語終了位置 - $単語開始位置; $単語 = mb_substr($ソーステキスト, $単語開始位置, $文字数); $単語 = 定数指定マーク除去($単語); if (日本語文字が含まれている($単語)) { $日本語名一覧[$単語] = 0; } $開始位置 = $単語終了位置; } } function 英語検索($日本語){ if (!empty($_SESSION[辞書セッション][$日本語])) { return $_SESSION[辞書セッション][$日本語]; } return ""; } function グローバライズマップマージ($グローバライズマップ) { if (!empty( $グローバライズマップ )){ if (empty($_SESSION[辞書セッション])) { $_SESSION[辞書セッション] = []; } foreach($グローバライズマップ as $日本語=>$英語) { $_SESSION[辞書セッション][$日本語] = $英語; } } } function グローバライズマップ保存($グローバライズマップ, $グローバライズソース出力基点フォルダー) { グローバライズマップマージ($グローバライズマップ); $グローバライズマップファイルパス = $グローバライズソース出力基点フォルダー.'/'.グローバライズマップ保存ファイル名; file_put_contents($グローバライズマップファイルパス, serialize($_SESSION[辞書セッション])); } function グローバライズマップ読込($グローバライズソース出力基点フォルダー) { $グローバライズマップ = []; if ( $グローバライズソース出力基点フォルダー == false) { return $_SESSION[辞書セッション]; } else { $グローバライズマップファイルパス = $グローバライズソース出力基点フォルダー.'/'.グローバライズマップ保存ファイル名; if (file_exists($グローバライズマップファイルパス)) { $グローバライズマップ = unserialize(file_get_contents($グローバライズマップファイルパス)); } } return $グローバライズマップ; } function 新規グローバライズ判定($プロジェクトファイルパス) { $プロジェクトファイルパス = str_replace("\\", '/', $プロジェクトファイルパス); $パス分割結果 = explode('/', $プロジェクトファイルパス); $最終パス名 = $パス分割結果[count($パス分割結果) - 1]; if ($最終パス名 == グローバライズフォルダー名) { return false ; } return true; } function グローバライズマップ作成() { $グローバライズマップ = []; foreach ($_REQUEST as $key=>$value) { if (日本語文字が含まれている($key)) { if (!empty($value)) { $グローバライズマップ[$key] = $value; } } } return $グローバライズマップ; } function グローバライズソース出力($ソースファイルパス, $グローバライズマップ, $グローバライズソース出力基点フォルダー){ $ソースコード = file_get_contents($ソースファイルパス); $日本語一覧 = array_keys($グローバライズマップ); array_multisort(array_map("mb_strlen", $日本語一覧), SORT_DESC, $日本語一覧); foreach ($日本語一覧 as $日本語) { $ソースコード = str_replace($日本語, $グローバライズマップ[$日本語], $ソースコード); } $ソースファイル名 = basename($ソースファイルパス); if (dirname($ソースファイルパス) == $グローバライズソース出力基点フォルダー) { $グローバライズソース出力ファイルパス = $ソースファイルパス; } else { $グローバライズソース出力ファイルパス = str_replace(dirname($ソースファイルパス), $グローバライズソース出力基点フォルダー,$ソースファイルパス); } if (!file_exists(dirname($グローバライズソース出力ファイルパス))){ mkdir(dirname($グローバライズソース出力ファイルパス), 0777, true); } file_put_contents($グローバライズソース出力ファイルパス, $ソースコード); } function グローバライズテキスト変換($ソースコード, $グローバライズマップ) { $日本語一覧 = array_keys($グローバライズマップ); array_multisort(array_map("mb_strlen", $日本語一覧), SORT_DESC, $日本語一覧); foreach ($日本語一覧 as $日本語) { $ソースコード = str_replace($日本語, $グローバライズマップ[$日本語], $ソースコード); } return $ソースコード; } ?> |
日本語でプログラムを書いて思うこと
同じ意味なのに微妙に違った言葉を使っていることに気づくこと。気づくと動きは変わらないのになおしたくなってしまうこと。結果プログラムコードが言葉として洗練されていくことが実感できたことが嬉しい。「プログラム言語」という言葉があるぐらいプログラムは言語に近い存在なのだから言葉遣いが自然によくなるのもありがたい。