質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

6回答

2316閲覧

objective-cのソースのきれいな書き方について

mm--_--mm

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2015/07/13 00:34

編集2016/04/19 06:10

いつもお世話になっております。

現在、objective-cを使用してiosのアプリの開発を趣味で行っております。
その際、viewやボタン等のUI関連のものをstoryboardを使用せずに全てソースコードで作成しています。

例えば、ViewController.mがあるとして置きたいボタンや行いたい処理を全てViewController.mも記述するようにしていて、ぱっとみた感じごちゃごちゃしてます。
storyboardを使わず、全てソースコードで作成する際わかりやすいまたは、見やすいソースコードの書き方はどんな方法があるのか教えていただけますでしょうか?

もしくは、こんな工夫をしているよ、というような事がありましたら教えていただけると幸いです。
独学で開発を行っておりますので近くに質問する事ができずに困っています....

よろしくお願いいたします。

*質問の修正依頼がありましたがこの質問でいうきれいというのはコードの構造のきれいさという意味です。質問が曖昧で申し訳ありませんでした。

※追記
たくさんのご回答誠にありがとうございます。個人的にはどれも参考になる回答ばかりでしたので、評価が最も高い回答をベストアンサーにさせていただきました。ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2015/07/13 10:14

これはテキスト整形の話ですか?それともコードの構造を整理する話ですか?
guest

回答6

0

ベストアンサー

こんにちは。

エンジニアにとって永遠のテーマでもあるような質問ですね。

さまざま有効な回答が得られるのではないかと思いますが、僕からは、ただひとつだけ。

すべてに適切な名前をつけて、つねにそれを維持しましょう。

クラスをはじめ、メソッド、関数、変数など、プログラムにおいて名前を持つものには、(極論すればそれでしかありえない)適切な名前をつけ、つねにその名前を維持していくことが重要です。
そうすることで、つぎにあげるような効果が生みだせるものと僕は考えています。

1)それが何であるのかが一貫してわかる
2)当該のコードや部分でなにを行うのかが明確になる
3)スコープが最適になる
4)プログラムが意味のレベルで整理され洗練される
5)コードの矛盾やずれ、間違いが排除される
6)コードの重複が排除される
7)コードがシンプルになる

ここ(teratail)でも時々、命名に関する質問が投稿されますが、(たとえそれが Objective-Cに関するものでなくても)そうした際にみなさんの回答に目を通すということも、命名についての考え方を学ぶという意味で勉強になるのではないかと思います。

以上、ご参考いただければ幸いです。

投稿2015/07/13 05:04

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/13 07:48

ご回答いただきありがとうございます! 詳しく説明していただきありがとうございます! ここに書いていただいた事を参考に開発を続けていきたいと思います!
退会済みユーザー

退会済みユーザー

2015/07/14 00:19

hirahasuさん、コメント(返信)をいただきありがとうございます。 コーディングにかぎらず、つねに学ぶ姿勢を忘れないことがいちばんだいじなことではないかと思います。
mm--_--mm

2015/07/14 01:14

はい! 始めたばかりでまだまだ分からない事ばかりなので頑張ります! ありがとうございました!
guest

0

リーダブルコードという本は読まれましたか?

読みやすいコードを書くための要点が、それが何故必要なのかという説明と共に述べられています。
ご自分のコードがごちゃごちゃしたものに見えるのは何故かを知るヒントになると思います。
もしも読んでいないのならお勧めです。

リーダブルコードに触発された(元にした)プレゼンテーション(一例)を公開している方も多いですから、まずそうしたものをご覧になってみては如何でしょうか。

投稿2015/07/13 02:46

編集2015/07/13 02:49
coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/13 07:49

ご回答いただきありがとうございます! まだ読んだ事はないです.... なので読んでみます! ありがとうございます!
guest

0

僕がよくやる構成をご紹介させていただきます

まず「A画面を作る」という場合に以下のようなクラスを用意します

  • AViewController
  • AView

役割を説明しますと画面の表示に関するものは全てAViewクラス、画面の処理に関する部分はAViewControllerクラスという分け方ですね

画面で起きたイベントはAViewのPropertyにdelegate、dataSource、block(closure)を生やしておいて、そこ経由でViewController側と連携させるって感じでやればViewControllerとViewの疎結合関係の出来上がりですね

投稿2015/07/16 13:06

編集2015/07/16 13:10
__moai

総合スコア264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/17 00:19

ご回答いただきありがとうございます! なるほど... UI部品と処理を別々のファイルで分けるということですね! これからの開発の参考にさせていただきます! ありがとうございました!!
guest

0

ドメイン特化言語(内部DSL)を導入してください。

一般的に、複雑なコードはリファクタリングを行うと綺麗に整理することができます。
しかし、今回のように「大きなオブジェクトの構造を構築する」といった場合は、リファクタリングでは解決できないので、ドメイン特化言語の導入が必要だと思います。

ドメイン特化言語の実装形態には、内部DSLと外部DSLがありますが、外部DSLを使うとStoryboardと変わらない内容になってしうので、今回は内部DSLが良いと思います。

ちなみに、「コードを綺麗に」を追求していくと、最終的にStoryboardを使うのが最良という結論に達すると思います。

投稿2015/07/13 14:52

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/14 01:13

ご回答いただきありがとうございます! 内部DSLですか... 初耳ですので色々と調べて参考にさせていただきます! ありがとうございます!
guest

0

クラスを使うとある程度スッキリするとおもいますよ。
class MyButton : UIButton イベント等もMyButton内で処理する。

投稿2015/07/13 05:30

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/13 07:44

ご回答いただきありがとうございます! なるほど... クラスに関してはまだまだ自分は使いこなせてないので参考にさせていただきます!
guest

0

残念ながらUIをソースコードで書く以上、どんなに頑張ってもごちゃごちゃした感じを完全に無くすことはできないと思います。そもそもStoryboard自体が、見た目で分かりやすく、そしてその様なごちゃごちゃを解消するためのものなのです。

それでもソースコードでやりたいという場合に、少しでもごちゃごちゃ感を減らす手として

UIのインスタンス生成やaddSubviewを1つのメソッドにまとめて、viewDidLoadなどからコールする

lang

1- (void)viewDidLoad 2{ 3 [super viewDidLoad]; 4 [self createUi]; 5} 6- (void)createUi 7{ 8 UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 50)]; 9 // ボタンのプロパティ設定 10 [self.view addSubview:button]; 11 // 以下略 12}

プロパティを使用している場合はgetterに初期処理を記述し、そのUI部品が必要になった時点でgetterをコールする

lang

1@interface ViewController () 2@property (nonatomic) UIButton *button; 3@end 4 5@implementation ViewController 6- (void)viewDidLoad 7{ 8 [super viewDidLoad]; 9 [self.view addSubview:self.button]; 10} 11- (UIButton *)button 12{ 13 if (!_button) { 14 _button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 50)]; 15 // ボタンのプロパティ設定 16 } 17 return _button; 18}

などの方法が考えられます。

投稿2015/07/13 02:36

shiolier

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/07/13 07:51

ご回答いただきありがとうございます! なるほど... こういった書き方もあるのですね! これからの開発野参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問