ソースコードの読み方
改修のために長いソースコードを読む際に疲れ果てる事が多いので対処法を調べた。
(手順)
1.ソースを読む目的を明確にする
仕様書を読んでどの機能を実装する必要があるのかを知る。
他に確認しておいたほうが良い項目
・ディレクトリ / ファイル構成
・データ構造
2.動的に解析する
実際の動作を確認する。その際デバッガを用いて引数などにも着目する。
3.静的に解析する
目的に沿って必要な部分のコードだけを読む。余計なところを読まない。
上から順に読んだり、全てを理解する必要はない。
コツ
・いきなり関数の中身を読むのではなく、まず関数同士の呼び出し関係(コールグラフ)を把握する。
・関数を読む際に後で分からなくなりそうなら平易な表現に置き換えておく(元のコードはバックアップしておく)
・元の設計書とは別に絵、図、表などを用いて分かりやすく自分用にメモを作るのも良い
・(機能の)全体→細部と見ていく
なお、基本的な文法を知らないと分からない事が出てくるたびに調べることになって効率が悪いので、言語の仕様は一通り把握しておく。
コードが読めない際は要件を把握できていないのか、文法を知らず何をしているのか分からないのか、という風に問題を分割して考える。
インスタンスの生成
const greetMorning = () => { this.x = 'GoodMorning!'; } let greet_ins = new greetMorning(); console.log(greet_ins.x);
まずこれでやろうとしたらgreetMorningはコンストラクタではないと怒られてしまった。(コンストラクタはアロー関数では定義できない)
//ES6以前の書き方
const Person = function(name, age) { this.name = name; this.age = age; } Person.prototype.setName = function(name) { this.name = name; }
メソッドはprototypeを用いる
//ES6以降の書き方
class Human { constructor(name, age) { this.name = name; this.age = age; } greet() { console.log(`Hello,Iam${this.name}`); } }
メソッドにprototypeを用いる必要はない
・クラスは同じ構造のオブジェクトを使い回したいときに使う
参考
cocodrips.hateblo.jp
用語集
ビジネス系
- レジュメ→講演など、一方的に話すような会の要点をまとめたもの
- アジェンダ→会議など、双方向で話し合いを行う会の要点や議題をまとめたもの
- ドキュメント→仕様書等の資料のこと
プログラミング系
オブジェクト指向において、データとデータに対する操作をオブジェクトとしてまとめ、外部が利用する必要のない変数などは秘匿すること。
※直接変数を書き換えたりはできないが、その変数を書き換えるためのメソッドは外部に提供する。
(外部から書き換えられたり、内部の変更が外部へ影響を及ぼす心配をする必要がなくなる、疎結合)
- ノード(DOM)→文章(Document)を構成するもの。HTML要素であればHTMLElements、テキストならテキストノード
- 辞書→key-valueのペアになっていて、keyで検索可能なデータ構造のこと
- オリジン→スキーム(プロトコル)、ホスト(ドメイン)、ポート番号によって定義される。全て一致した場合のみ同一オリジンとして扱われる。
ex: http://(スキーム)www.hogehoge.co.jp(ホスト):80(ポート)
- CRUDアプリケーション→データを永続的に扱うための基本機能であるCreate、Read、Updata、Deleteをもつアプリケーションのこと
- RESTful API→RESTの原則に則って構築されたAPIのこと
- REST→https://blog.api.rakuten.net/ja/jp-restful-api/
(分からない単語・概念)
同じ日付を連続したセルに入れたい場合
普通にドラッグしただけでは1日ずつ進んだ値が入力されてしまう。
この場合 " Ctrl + ドラッグ "
をすると同じ日付を連続したセルに入力できる。
存在しないプロパティへのアクセス
let array = {"c": {}}; let val1 = array[a][b]; // reference to undefined propertyエラーになる let val2 = array[c][d]; // undefが返る
違いは取り出したいプロパティの直前のオブジェクトが存在するかしないか。
val1はaが存在しないのでエラーになるが、val2はcが存在するのでエラーにはならない。