Introduction to Systematic Programming – Locals & Abstraction (第 7 週)
第7週目は、ローカル表現と抽象表現の両方の概念を取り入れました。私の場合と同様に、今週は他のコースからの半分のレビューで、素晴らしくて新鮮でした、そしてBAM、新しい概念は私を完全にループに投げ込みました。
第7週目は、ローカル表現と抽象表現の両方の概念を取り入れました。私の場合と同様に、今週は他のコースからの半分のレビューで、素晴らしくて新鮮でした、そしてBAM、新しい概念は私を完全にループに投げ込みました。
これ自体に文句を言うわけではありませんが、それは私のコンセプトツールボックスに物事を追加するのに最適な方法だと思います(古いものを見直してから新しいものを投入する)が、それは少しジェットコースターのようなものです。
レッスン 1: ローカル表現の概要
今週の最初のエキサイティングな要素は、別の言語のアップグレードです!次に、中級学生言語に移行します。スコア。
ローカル式に関しては、この入門レッスンでは、ローカル式とは、プログラムの一部でのみ機能する関数と定数を持つ式であることを学びます。ここでの情報は以上です。これについては後で詳しく説明します...
レッスン2:ローカル表現 – 形成と直感
私たちの生活を中級の言語にアップグレードすることで、レッスン1で漠然と定義したように、地元の表現を利用する能力が得られます。基本的に、ローカル式は、独自の関数と変数を持つ小さなパッケージ化された式であり、ローカル コンテナーの外部でプログラムの他の部分と対話することはできません。ここでは、地元の人の解剖学をご紹介します。

この例では、両方の "defines" は、このローカル コンテナー内にのみ存在する変数の定義であり、つまり、"a" がプログラムの最上位、つまりこのローカルの外部で参照されている場合、このローカル WITHIN a に対して行うことは、"a" の他のインスタンスには関係ありません。なぜでしょうか。なぜなら、"a"がローカルで使用されている場合、それはそのローカル内にのみ存在し、プログラム内にある可能性のある他の "a"とは相互作用しないからです。これは、すべてのローカルで「a」を使用することもでき、ローカルを正しく構成している限り、それらの間には何も起こらないことを意味します。
レッスン 3: ローカル式 – 語彙スコープ
スコープの等高線は、ローカル定義にアクセスできる場所に関する質問に答えます。字句スコープは、基本的に、式が評価される最も内側の囲む領域内にある関数または変数の定義を使用することを示します。
レッスン 4: ローカル式 – 評価ルール
前述したように、地元の人々は表現であり、彼らの範囲外のものに影響を与えることはありません。評価の手順は次のとおりです。
- 名前の変更– ローカルの定義を取得し、それらへのすべての参照を見つけ、それらに対して新しいグローバルに一意の名前を考え出し、古い名前のすべてのインスタンスをこの新しい一意の名前に置き換えます。
- リフティング– 名前を変更した定義を最上位レベルに移動します。
- Replace– ローカル全体をその本体のみに置き換え、名前を変更した定義に置き換えます。
興味深いことに、このようにローカルな表現を評価することで、実際にはローカルな表現としての存在を排除していることになり、したがって、理論的にはあなたのプログラムはBasic Student Languageで書かれていた可能性があります。
レッスン 5: ローカル式 – カプセル化
カプセル化とは、プログラムの各部分を、トップレベルのいくつかの小さなアイテムとのみ相互作用する小さなパッケージに変換することです。基本的には、地元の人々を内部に持つ単一の機能を作っています。関数をカプセル化する場合、グローバルにアクセスできなくなったことを覚えておくことが重要です。ただし、これはカプセル化された関数であるため、シグネチャやテストを記述する必要がないことも意味するため、結果的に時間を大幅に節約できます。しかし、それでもテストしたいかもしれないので、それを忘れずに行ってください。
関数がカプセル化の候補として適しているかどうかは、どうすればわかりますか?まぁ。。。。
- 密接にリンクされたヘルパーを持つ 1 つの関数として存在しますか?
- 外部プログラムは本当にヘルパーではなく、1つのmain関数を呼び出すだけで済みますか?
この2つに「はい」と答えた方は、カプセル化に最適な候補を探している可能性が高いです。
How do you encapsulate a function?
- カプセル化するすべての関数をグループ化します。
- 新しいグローバル関数名と必要なパラメータを使用して定義を開きます。
- ローカル式を開き、元の関数定義の直前に [ を付けてローカルの定義部分を開きます。
- 元の関数定義の後に]を付けて定義部分を閉じます。
- ローカルで定義されている関数のトランポリン呼び出しを最後に追加します。
- 不要なテスト、シグネチャ、およびスタブを削除します。
- テストと必要なスタブの名前を変更します
- RUN FREE! YOU GOT IT!
また、テンプレートにカプセル化を含めることもできますが、これを行うと、基本ケースをテストする能力がなくなることに注意してください。
このレッスンのその他の注意事項:
このレッスンで取り上げる別のトピックは、プログラムの動作を変更しないプログラムの構造変更であるリファクタリングです。ただし、何かをリファクタリングしてその動作を変更することはできますが、これらの変更の両方を同時に行うことはお勧めしません(一度に多くのことをしようとすると間違いを犯しやすくなります)。
レッスン 6: ローカル式 – 再計算の回避
ついに、このクラスのコード効率の概念にたどり着きました。このレッスンは、プログラムが動作した後でコードの効率について心配する必要があるという考えから始まります。ある意味では、特に初心者にとっては、私はこれに同意しますが、少し同意しません。コードの効率性は、コーディングのキャリアの最初から根付くべきであり、そうすれば、後付けではなく自然な考え方になると思います。そうは言っても、このレッスンでは指数関数的な成長を排除することに焦点を当てています。基本的に、ここでの解決策は非常に状況に左右されるため、あまり詳しく説明したくありません。ただし、アリティツリーを使用しているときに、検索をローカライズできれば、コードがより簡潔で効率的になるという点が重要です。J
レッスン 7: 抽象化の概要
プログラミングにおける抽象化は、プログラムの複雑さを管理する方法です。#IAbstractedThatLessonForYou
レッスン 8: 例からの抽象化、パート 1
抽象化するときは、関数の共通部分を抽象関数に引き出す必要があります。(注:異なる部分は「分散点」と呼ばれます。
関数では、名前をより汎用的な名前に変更し、分散点を表すパラメーターを配置し、分散点を名前を変更したパラメーターに置き換えます (再帰でもパラメーターを渡すことを忘れないでください)。
なぜ関数を抽象化したいのですか?
まぁ!
高階関数は、複数の関数を消費できます。また、関数を生成することもできます。
だから、それに慣れてください。その方が良いです。約束。
レッスン 9: 例からの抽象化、パート 2
レッスン 9 は、主にレッスン 8 の続きの例を使用して作業するため、通常どおり操作し、例のランスルーを取り除き、重要なポイントを提供します。
- 関数は、他の関数を引数として使用できます。
- 抽象化は、ほとんどのプログラミング言語に存在し、機能します。
- 抽象化の場合、目的のステートメントを書くのは非常に難しいので、練習を始めましょう。
レッスン 10: 例からの抽象化、パート 3
抽象化を行うときは、目的のステートメントを書くよりもさらに難しいため、署名を書くのは最後になります。それを解決するためのヒントは、型推論を使用することです。型の推論は、次のようになります。
- 関数が生成する最も基本的なものを見つけ、それがシグネチャの結果になります。
- 渡された/必要な引数を見つけます。これらは、シグネチャの引数の型です。
簡単に聞こえるかもしれませんが、抽象化にはあまりにも多くのことが起こっているため、かなり戸惑うことがあります。落胆しないで、全体のデザインレシピ理論で行うように、取り組んでいることを単純化することに集中してみてください、そしてあなたはちょうど大丈夫です。
このレッスンのその他の注意事項:
- 関数が引数として渡される場合は、そのシグネチャを大きい方のシグネチャの () に書き込みます。
- リストは別の方法で記述できます。ListOfX の代わりに (listof X) を使用できるようになりました
レッスン 11: 組み込み抽象関数の使用
Map と Filter は、より一般的に使用される組み込み抽象関数の 2 つであり、coursera コースの言語ページにはそれらすべてがリストされています。(courseraクラスを受講していない場合は、同じ情報でチェックアウトできる外部リンクがあります: BSL Built-In Abstract Functions。
組み込みの抽象画はかなり甘く、現実には、それがかなり一般的な感じであれば、あなたの直感を信じてリストをチェックしてください-それはおそらく組み込みです!
Lesson 12: Closures
抽象関数の引数として渡している関数がまだ存在しない場合があります。この場合は、常にローカルで定義できます。
HOWEVER
場合によっては、選択の余地がないこともあります。あなたはそれを止めて定義しなければなりません。
それはいつ頃ですか?
抽象関数に渡す関数の本体が、外部関数のパラメーターを参照している場合。したがって、外側の関数の関数定義は内側の関数の周りを閉じ、閉じます。(その語彙のスコープを覚えていますか?はい!
レッスン 13: 抽象フォールド関数
このレッスンでは、テンプレートから直接抽象的な関数に移行する方法の概要を簡単に説明し、文字通り途中ですべてのベタベタを切り取り、コードを書く時間を最適化します。イェーイ。要するに、fold 関数は、テンプレートに直接基づく抽象関数です。
Week 7 Summary
冒頭で述べたように、このレッスンは後半にとても新鮮でした。抽象関数に関連する独自のヒントやコツがある場合は、お知らせください。また!第8週は授業の最後の週なので、次のブログはシリーズの最後になります。しかし、心配しないでください、私は今後のエントリのためにたくさんの計画を持っています。