見出し画像

エンジニアのお前らを卒倒させるコード書いてみた

こんにちは


そういえば自分がプログラマであることを思い出したので、
たまには技術系の記事でも書いてみようと思います。


「プログラミングよく分かんないよ~;;」という方はガン無視して書いていきますので、恐れ入りますが頑張ってください



「プログラミング分かるぜ!!!」という方は本記事を読むと頭が痛くなってくるかと思いますが、頑張って読んでください




初級編①


それではこちらのコードをどうぞ(言語はJava)


Main.Java

public Class Main{

 public static void main(String[] args) {

  String hensuuwa-rudo = "Hello, World!";

  // ↑の文字列を「GoodBye, World?」にして出力

  System.out.println(hensuuwa-rudo.replace("Hello", "GoodBye").substring(12, 13).concat("?"));

 }

}









①変数名がキモ過ぎる

String hensuuwa-rudo = "Hello, World!";

・変数名を日本語名+英語名にするな
・単語の区切りは大文字にしろ
・そもそも変数ワールド is 何

一応プログラミング知らない人向けに補足すると、
「変数」という箱に文字列を代入できるんですが、
この変数名が「hensuuwa-rudo」なのが読みにくすぎるという話です
命名規則大事


②引数にメソッドをぶちこみ、メソッドチェインをふんだんに利用した長い長い1文

String hensuuwa-rudo = "Hello, World!";
System.out.println(hensuuwa-rudo.replace("Hello", "GoodBye").substring(12, 13).concat("?"));

(うわぁ読みにく・・・・)

補足
printlnメソッド:コンソールに文字列を出力する
replaceメソッド:第1引数の文字列を第2引数の文字列に変換して戻す
substringメソッド:与えられた区間の文字列を切り出して戻す
concatメソッド:文字列を後ろに連結する

・1文にまとめるな!!!!!!読みにくいだろ!!!
・メソッドの引数にメソッドを使うな(場合による)
・メソッドを3つも繋げるな(場合による)
・substringとconcatなんか使わんでreplaceで統一しろ



誰だよこのコード書いたの!!!!!!!!
あ、俺か・・・・





リファクタリング(言いたいだけ)

Main.Java

public Class Main{

 public static void main(String[] args) {
  // 変更前
  // String hensuuwa-rudo = "Hello, World!";
  // System.out.println(hensuuwa-rudo.replace("Hello", "GoodBye").substring(12, 13).concat("?"));

  // 変更後
  String helloWorld = "Hello, World!";

  // 「GoodBye, World?」に変換して変数に代入
  String goodbyeWorld = helloWorld.replace("Hello", "GoodBye").replace("!", "?");

  // コンソールに出力
  System.out.println(goodbyeWorld);

  // そもそも変数使わずに System.out.println("GoodBye, World?"); で良くね?という方はお黙りください
 }

}

いくらかマシになった気がしますが、
「GoodBye, World?」という不穏なメッセージを表示させたい人間の気持ちが分からないので、要件定義からやり直す必要があるかもしれません



初級編②


Main.Java

public Class Main{

 public static void main(String[] args) {
  // 1~5までの配列を生成
  int[] array = new int[];
  for(int i = 1; i < 5; i++) {
   // 数字を格納
   array[i] = i;
  }

  String message;

  // 拡張for文で変数messageに文字を連結
  for(int num : array) {
   message += num.toString();
  }

  // コンソールに出力
  System.out.println(message);
 }
}


コンパイルエラーだらけなので全然よくないです




①変数・配列をちゃんと宣言しろ

int[] array = new int[];

これダメです。
配列は固定長なので、要素数を指定するか、宣言と同時に値を代入して初期化しないといけないです。
(リストなら可変長なので長さ指定しなくてもOK)


// int[] array = new int[];

// 修正例1
int[] array1 = new int[5];

//修正例2
int[] array2 = {1, 2, 3, 4, 5};


あとこれもダメ

  String message;

  // 拡張for文で変数messageに文字を連結
  for(int num : array) {
   message += num.toString();
  }

  // コンソールに出力
  System.out.println(message);
 }

文字列型変数のmessageが初期化されていない(最初に値が入ってない)ので、文字列連結させようとしたりprintlnの引数にさせようとするとコンパイルエラーとなります。



②for文が回せてないよ~

  // 1~5までの配列を生成
  int[] array = new int[];
  for(int i = 1; i < 5; i++) {
   // 数字を格納
   array[i] = i;
  }

forループの初期値が i=1、継続条件が「iが5未満」なので、
「1, 2, 3, 4」の4回しかループしないです。

よってこの配列は、
「null, 1, 2, 3, 4」の5要素となります。

補足
null:「何もない」という概念
要素番号:java含め、多くの要素番号は0から始まる
     ただしpythonだけ1から始まる1から始まるのはRとかLuaでした(無学)

配列arrayは要素0に「null」が入ってしまっているため、
以下の個所で「nullPointerException」となります。ガッ

  // 拡張for文で変数messageに文字を連結
  for(int num : array) {
   message += num.toString();
  }



refactoring(カッコつけたいだけ)

Main.Java

public Class Main{

 public static void main(String[] args) {
  // 1~5までの配列を生成
  int[] array = new int[5];
  for(int i = 0; i < array.length; i++) {
   // 数字を格納
   array[i] = i + 1;
  }

  String message = "";

  // 拡張for文で変数messageに文字を連結
  for(int num : array) {
   message += Integer.toString(num);
  }

  // コンソールに出力
  System.out.println(message);
 }
}



まとめ

中級編まで書こうと思いましたが、初心者なので初級編までしか書けませんでした。

自分でクソコードを生み出し、解説し、修正するという意味の分からない時間外労働をさせられましたが、毎日投稿が1日消化できたので満足するとします。

それではまた。

この記事が気に入ったらサポートをしてみませんか?