だいたいそれでいいんじゃないの

つれつれなるkixixixixiの技術的なストック。http://reload.co.jp

こんなコードはいやだ【Objective-C】

最近うけた案件があるアプリの改修でした。
そちらのコードが御法度の詰め合わせのフルコンボみたいな記事になっていたので、
そのバッドノウハウの共有になればと思い記事にしました。 基本的には、「こうしよう!」というものでなく、「これはやめよう!」という事例を集めています。

アプリの概要
- iOS用のライフスタイルアプリ
- コードはObjectiveC

データをハードコーディングするのはやめよう

アプリケーションではマスターデータのようなデータを共通で使う場面があると思います。 例えばそのデータが100件を超えていたら、実行ファイルにハードコーディングなんてして欲しくないですよね。

[NSArray arrayWithObjects:@"10",@"72",@"109",@"11",@"90",@"8",@"9",@"13",@"14",@"15",@"6",@"120",@"50",@"7",@"74",@"75",@"76",@"77",@"95",@"79",@"81",@"78",@"36",@"83",@"80",@"16",@"5",@"107",@"88",@"84",@"85",@"98",@"87",@"18",@"106",@"17",@"86",@"119",@"82",@"108",@"100",@"3",@"118",@"124",@"39",@"2",@"1",@"96",@"99",@"41",@"42",@"4",@"40",@"73",@"19",@"110",@"20",@"21",@"22",@"23",@"37",@"91",@"92",@"93",@"94",@"112",@"113",@"114",@"115",@"116",@"35",@"38",@"117",@"89",@"52",@"54",@"55",@"33",@"51",@"122",@"97",@"105",@"24",@"25",@"26",@"28",@"104",@"43",@"44",@"71",@"27",@"47",@"49",@"48",@"121",@"53",@"123",@"101",@"102",@"103",@"29",@"45",@"46",@"30",@"31",@"32",@"2000",@"3000", @"56",@"57",@"58",@"59",@"60",@"61",@"62",@"63",@"64",@"65",@"66",@"67",@"68",@"69",@"70",nil];

そもそもなんのデータかわからなくなるような配列はよくない。

変数名はデータの意味を伝えよう

wavioarray = [NSArray arrayWithObjects:@"2",@"2", ...

略称なのかもわかんないし、そもそも単語の区切りはしっかりしよう。

NSArray *allarray;

意味広すぎるのにグローバル変数にするのはなしでしょ...

NSMutableArray *e1quantityarray;

変数名に数字を使わないでほしい。

NSInteger selectnumeronumber;

何語なのか...

キャメルケースにしよう

クラス名やメソッド名などはちゃんと単語の区切りはわかるようにしよう。
ObjectiveCやJavaなどはキャメルケースだし、rubyperlメソッドならスネークで、クラスはキャメル。 ObjectiveCでかいてるんだから、クラス名は先頭大文字で、メンバは先頭小文字。

class inputcaloryviewController

やめて。

コードのコピペはやめよう

自分の書いたコードだとしても他のファイルなどにコピーペーストするのはやめよう。
実行ファイルに書いたマスターデータを複数のファイルに転載するのはおかしい...
コピペミスしている部分があるし、まさにコピペの弊害を自分でひきこおこさないでほしい...
ロジックでもハードコードでも、3箇所以上かいてるならどこかにまとめよう。
抽象化まではしないでも共通化しよう。 10回もコピペするのは本当に良くない。

変数に意味をもたせよう

インスタンスメンバとして作ったものに違うデータをいれるのはやめよう。
touchonnumeber とかいう変数に対象のもののデータを入れてたら、わかんなくなる。

文字列は文字列。数字は数字として扱おう

数字のデータをStringにして代入し、取り出すたびに毎回キャストするのはやめよう。

データは意味でまとめよう

例えば食べ物の名前と、そのカロリーというデータがあったとしてそれを2つの配列で扱うのではなく、

wacaloryarray = [NSArrat arraywithObjects:@"10", @"20", ...
wanamearray = [NSArrat arraywithObjects:@"ごはん", @"味噌汁", ...

食べ物自体でまとめよう。

foods = @[
  @[@"id": @1, @"name": @"ご飯", @"calory": @10],
  @[@"id": @2, @"name": @"味噌汁", @"calory": @20],
  ...

数が合わなくなるとかそういうミスもないし、意味でまとまっているから確認しやすいはず。
オブジェクトにした方がもっといい。

Warningは極力へらそう

4000個もwarningがあったらデバッグができたものではない。

バグを残したままにしないでおこう

うん。お願いします。

ObjectiveCならではのやつ

下記のようなものもあったけど、今度機会あれば。

  • リテラルにしよう
  • タグで状態を管理しない
  • AppDelegateは値の受け渡しに使うのはおかしい
  • Modelをつくろう