リーダブルコードを読む part1
こんにちはかわです。
アドベントカレンダー16記事目です。
今回は
この本を読み進めて章ごとに要約していきたいと思います。
1章 理解しやすいコード
1 優れたコードとは?
「簡潔」と「安心」はどちらが大切か?
Ruby 2.4.0
//九九の表示 //簡潔例 1.upto(9){|i|1.upto(9){|j|puts"#{i} * #{j} = #{i * j}"}} //安心例 for i in 1..9 do for j in 1..9 do result = i * j puts"#{i} * #{j} = #{result}" end end
2 読みやすさの基本定理
コードは他の人が最短時間で理解できるように書かなければいけない
3 小さいことは絶対にいいこと?
「理解するまでにかかる時間」を短くすることが大切!!!
コードは短ければいいということではない。
コードを短くし、理解に時間がかかるのであれば長いままでもいいし、
コメントを書いたほうがわかりやすくなるのであれば書いたほうがいい
4 「理解するまでにかかる時間」は競合する?
高度に最適化されたコードであっても、理解しやすくすることができるはず。
理解しやすいコードは、優れた設計やテストのしやすさにつながることが多い。
以上
Swift 基礎文法 part4
こんにちはかわです。
アドベントカレンダー15記事目です。
やっていきます。
クラス
アクセス修飾子
修飾子 | 説明 |
---|---|
open | モジュール外からもアクセス可能 |
public | モジュール外からのアクセス可能だが継承、オーバーライドが不可 |
internal | モジュール内からのアクセス可能(デフォルト) |
fileprivate | 同じファイル内からのアクセスを可能 |
private | クラス等の宣言内のみからのアクセスを可能 |
class Human{ private var age = 0 private var name = "" init(_ n: String,_ a: Int){ //イニシャライズ name = n age = a } func hallo() { print("Hallo") } func Age() -> Int{ return age } func Name() -> String{ return name } } var hu = Human("kawa", 2) hu.hallo() // => Hallo print("\(hu.Age())歳") // => 2歳 class JapaneseHuman: Human{//Humanを継承 override func hallo() {//オーバーライド super.hallo() //Humanクラスのhallo()が起動 print("こんにちは") } } var ja = JapaneseHuman("river", 25) ja.hallo() /*=> Hallo こんにちは */
構造体
書式
struct 構造体名{}
struct Calculator{ func add(value: Int, value2: Int) -> Int{ var result: Int = 0 //処理は省略 return result } }
while文
var result = 0 var i = 0 while i < 10{ result += i i += 1 } print(result)// => 45
guard文
書式
guard let チェック後に利用する変数名 = チェックする変数名 else {
変数が無効であった場合の処理
}
以上
Swift 基礎文法 part3
こんにちはかわです。
アドベントカレンダー14記事目です。
がんばります。
辞書とオプショナル型
var score: [String: Int] =[ "math": 90, "kokugo": 75, "science": 80, "english": 90 ] print(score["english"]) // => Optional(90) score["society"] = 35 print(score["society"]!)// => 35 アンラップした状態 print(score["P.E"]) // => nil var name: String? // => オプショナル型 print(name) name = "kawa" print(kawa) // => Optional("kawa") // オプショナルバインディング var value: String? value = "こんにちは" if let value = value { // アンラップ処理 print(value) // => こんにちは }
関数
func add(a : Int, b: Int) -> Int{ return a + b } print(add(a: 1, b: 2)) //外部引数名の指定 func sub(num1 a: Int, num2 b: Int) -> Int{ return a - b } print(sub(num1: 3, num2: 1)) //引数名省略 func mul(_ a: Int, _ b: Int) -> Int{ return a * b } print(mul(5, 4)) //可変長引数 func sum(_ a: Int...) -> Int { //a には配列が入る var sum: Int = 0 for num in a{ sum += num } return sum } print(sum(1, 2, 3, 4, 5))
enum
/*enumの定義 書式 enum enum名: 型名{ case 列挙子 } */ enum Fluit{ case Apple case Orange }
throw処理 と defer処理
//エラータイプの宣言 enum Myerror: Error{ case InvalidValue } /* エラーをthrowする可能性がある関数 throwを行う可能性がある関数の宣言 func 関数名(引数) throw -> 戻り値の型 throw処理の記述 throw エラータイプのプロトコルに準拠したenum */ func doubleUp(_ value: Int) throws -> Int{ if value < 0{ throw Myerror.InvalidValue } return value * 2 } //エラーハンドリング do{ //deferには処理終了時に必ず行う処理を記述 defer{ print("処理が終了しました") } var doubleResultValue = try doubleUp(-1) //tryを付ける必要がある print("正常終了") }catch Myerror.InvalidValue { print("Error") } /* 正常終了時 正常終了 処理が終了しました ERROR時 処理が終了しました Error */