川のブログ

川の適当気ままなブログです。 

リーダブルコードを読む 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 「理解するまでにかかる時間」は競合する?

高度に最適化されたコードであっても、理解しやすくすることができるはず。

理解しやすいコードは、優れた設計やテストのしやすさにつながることが多い。

以上

kawakawa.hatenablog.com

Swift 基礎文法 part4

こんにちはかわです。

アドベントカレンダー15記事目です。

やっていきます。

kawakawa.hatenablog.com

クラス

アクセス修飾子
修飾子 説明
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 guard文 - Google 検索

以上

Swift 基礎文法 part3

こんにちはかわです。

アドベントカレンダー14記事目です。

がんばります。

kawakawa.hatenablog.com

辞書とオプショナル型

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
*/

以上

kawakawa.hatenablog.com