こんにちは!
ナビゲータのEVEです。
中小企業診断士の二次試験の勉強ですが、令和3年に入っています。令和4年の問題を分析をしながら進めたので、二度目になると、事例Tだと解答と比較的近いモノが書けるようになってきます。中小企業診断士の問題は、試験を実施している機関から、解答が公表されているわけではないので、これで合格となかなか断言するのは難しいのですが、実際に試験に合格した先生方が作成した解答なので、多分合格に近づいているのだと思います。
ただ、そんな中小企業診断士二次試験からブログに書いてみたいような内容がなかなかないため、「システムエンジニアが目指す中小企業診断士」は書きたい内容がでてきたら、書くとして、しばらくは、「ゼロからはじめるシステム開発」で、起業に向けた準備をしたいと思います。
[JavaScript]
起業の準備をするにあたり、今調べてみると、思った以上にJavaScriptの需要が多いのに驚きます。Googleのシステムなんか、JavaScriptという言語から想像できないようなシステムを作っているような状況から、かなり複雑なスキルが求められているのでしょうか?
そんな以前のGoogleのJavaScriptプログラミングを見て、何をしているのか全く理解できなかったことがありましたが、それは、ブログに以前書きましたが、JavaScript特有のオブジェクト指向で記述されていたためでした。ただ、近年他言語と同じようなオブジェクト指向の構文が用意されたため、オブジェクト指向のJavaScriptでも容易にプログラムを読むことができるようになりました。それでは、2024年04月26日の続きになりますが、JavaScriptについて調査していきます。
[Java言語の調査]
他言語と近くなったというJavaScriptなのですが、近くなったとはいえ、違う部分もあるようです。何が同じで何が違うのか、私が精通しているJava言語からオブジェクト指向としてのJavaScript言語を調べてみたいと思います。
それでは、JavaScirptを調べる前に、Javaとはどんな言語でだったのか、思い出してみたいと思います。それについて、ChatGPTに聞いてみました。
Javaは以下のような機能を有した言語です。
❶オブジェクト指向:
Javaは完全なオブジェクト指向言語であり、すべてがオブジェクトとして扱われます。
❷クラスとオブジェクト:
クラスはオブジェクトの設計図であり、オブジェクトはクラスのインスタンスです。Javaではクラスを使ってオブジェクトを作成し、操作します。
❸カプセル化 (Encapsulation):
データ(フィールド)とメソッドをクラス内にまとめ、外部から直接アクセスできないようにすることで、データの保護とプログラムのモジュール化を実現します。
❹継承 (Inheritance):
Javaでは、あるクラスが他のクラスの機能を引き継ぐことができます。これにより、コードの再利用が促進されます。
❺ポリモーフィズム (Polymorphism):
同じメソッド名で異なる動作を実装することができます。オーバーロード(同一クラス内でメソッドの引数が異なる複数のメソッドを定義)とオーバーライド(継承関係にあるクラスで親クラスのメソッドを再定義)が含まれます。
❻抽象化 (Abstraction):
抽象クラスやインターフェースを用いて、具体的な実装を隠蔽し、重要な機能だけを外部に公開します。
❼インターフェース (Interface):
インターフェースを使用することで、クラス間の契約(コントラクト)を定義し、異なるクラスが同じメソッドを実装することを強制します。
❽メモリ管理 (Garbage Collection):
Javaにはガベージコレクション機能があり、プログラムが使用しなくなったメモリを自動的に解放します。
❾例外処理 (Exception Handling):
Javaでは、エラーや例外をtry-catchブロックで処理する仕組みがあり、プログラムの健全性を保つことができます。
❿プラットフォームの独立性:
JavaのコードはJava Virtual Machine (JVM)上で実行されるため、OSに依存せず、どこでも動作します。
⓫パッケージ化 (Packaging):
Javaでは関連するクラスをパッケージ(package)としてグループ化し、名前空間を提供することでクラスの衝突を避け、コードの整理を容易にします。
⓬メソッドのオーバーロード (Method Overloading):
同じクラス内で同名のメソッドを複数定義できますが、引数の型や数が異なる場合に限ります。これにより、同じ動作を異なる入力で処理することが可能です。
⓭メソッドのオーバーライド (Method Overriding):
サブクラスが親クラスのメソッドを再定義することができます。これにより、サブクラス独自の振る舞いを持たせることができます。
⓮スレッド (Threading):
Javaはマルチスレッドプログラミングをサポートしており、複数のスレッドで同時にタスクを実行することが可能です。これにより、並列処理やバックグラウンドタスクの実装が容易になります。
⓯シリアライゼーション (Serialization):
オブジェクトの状態をバイトストリームに変換し、保存またはネットワークを介して送信することができます。これにより、オブジェクトの持続性やリモートプロシージャコールが可能となります。
⓰ジェネリクス (Generics):
クラスやメソッドで使用するデータ型をパラメータ化でき、型安全なコードを記述することができます。これにより、コンパイル時に型の不整合を防ぎます。
⓱ラムダ式 (Lambda Expressions):
Java 8から導入されたラムダ式により、簡潔に無名関数を記述することができ、コードの可読性と保守性が向上します。主に関数型インターフェースと共に使用されます。
⓲ストリームAPI (Stream API):
Java 8から導入されたStream APIを使用することで、データの操作(フィルタリング、マッピング、集計など)を関数型プログラミングスタイルで効率的に行うことができます。
⓳アノテーション (Annotations):
アノテーションはメタデータをコードに付加する機能で、特定のコンパイラ動作やランタイム処理を指示するために使用されます。例えば、@Overrideはメソッドがオーバーライドされていることを示します。
⓴リフレクション (Reflection):
Javaではリフレクションを用いて、実行時にクラスやメソッド、フィールドの情報を動的に取得したり、操作したりすることができます。これにより、動的なオブジェクト操作が可能となります。
❶〜⓮までは、よく知る機能です。それでは、以上の機能をJavaScriptは実装しているのかChatGPTに聞いてみましょう!
❶オブジェクト指向:
JavaScriptもオブジェクト指向の概念をサポートしており、オブジェクトを使ってデータとメソッドを管理します。ただし、プロトタイプベースのオブジェクト指向(クラスベースではなくプロトタイプ継承)を採用しています。
❷クラスとオブジェクト:
ES6以降、JavaScriptでもclassキーワードが導入され、クラスを使ってオブジェクトを作成できます。ただし、内部的にはプロトタイプを使用しています。
❸カプセル化 (Encapsulation):
JavaScriptでは、private修飾子はありませんが、クラス内で#を使ってプライベートフィールドやメソッドを定義することが可能です。また、モジュールを利用することで、変数や関数を外部から隠すことができます。
❹継承 (Inheritance):
JavaScriptでもextendsキーワードを使ってクラス継承が可能です。プロトタイプチェーンを使って継承を実現します。
❺ポリモーフィズム (Polymorphism):
JavaScriptでもオーバーライドによるポリモーフィズムが可能です。同じメソッド名で異なる振る舞いを持たせることができますが、オーバーロードはサポートされていません。
❻抽象化 (Abstraction):
JavaScriptには抽象クラスやインターフェースの概念はありませんが、クラスや関数を使って抽象化を行うことができます。また、interfaceや抽象クラスの代わりに、ドキュメント化や型注釈(TypeScript)を利用することが多いです。
❼インターフェース (Interface):
JavaScript自体にはインターフェースはありませんが、TypeScriptを使用すると、インターフェースを定義して型安全なコードを書くことができます。
❽メモリ管理 (Garbage Collection):
JavaScriptも自動ガベージコレクションをサポートしており、メモリ管理が自動で行われます。
❾例外処理 (Exception Handling):
JavaScriptでもtry...catchブロックを使って例外処理を行うことができます。throw文を使って独自の例外をスローすることも可能です。
❿プラットフォームの独立性:
JavaScriptはブラウザ上で動作し、ほとんどのプラットフォームで実行可能です。Node.jsを使えばサーバーサイドでも動作します。
⓫パッケージ化 (Packaging):
JavaScriptではES6モジュール (import / export) を使ってコードをモジュール化し、名前空間を分けることができます。パッケージ管理にはnpmやYarnが利用されます
。
⓬メソッドのオーバーロード (Method Overloading):
JavaScriptにはメソッドのオーバーロードはありませんが、関数の引数にundefinedをチェックして振る舞いを変えることで、似たような機能を実現できます。
⓭メソッドのオーバーライド (Method Overriding):
JavaScriptでは、サブクラスで親クラスのメソッドをオーバーライドすることが可能です。
⓮スレッド (Threading):
JavaScriptはシングルスレッドですが、Web Workersを使用してバックグラウンドで処理を行うことができます。また、非同期処理(async/awaitやPromise)を活用することで、効率的な並行処理が可能です。
⓯シリアライゼーション (Serialization):
JavaScriptではJSON.stringify()を使ってオブジェクトをJSON形式にシリアライズし、JSON.parse()を使ってデシリアライズできます。
⓰ジェネリクス (Generics):
JavaScript自体にはジェネリクスはありませんが、TypeScriptを使うことでジェネリクスを導入し、型安全なコードを書くことができます。
⓱ラムダ式 (Lambda Expressions):
JavaScriptではアロー関数があり、簡潔に無名関数を記述することができます。functionキーワードを使わずに、() => {}の形で関数を定義できます。
⓲ストリームAPI (Stream API):
JavaScriptにはJavaのようなStream APIはありませんが、Array.prototype.map()やfilter()、reduce()などを使って、類似の処理が可能です。
⓳アノテーション (Annotations):
JavaScriptにはJavaのようなアノテーションはありませんが、デコレーターを使うことで似たような機能を実現することができます(TypeScriptではより強力にサポートされています)。
⓴リフレクション (Reflection):
JavaScriptではReflectオブジェクトやObjectメソッドを使用してリフレクション的な操作が可能です。たとえば、オブジェクトのプロパティを動的に取得・操作することができます。
ざっと読んでみると、Javaで利用できる機能は、TypeScriptなどの機能を利用することにより実現することができそうです。
[あとがき]
以上のすべてを利用するわけではないのですが、使用しそうな機能から順に、調べて実際にプログラミングをしていきたいと思います。
明日からブログは、その調査結果をまとめていきます。
なお、本日調べていて気づいたことが・・・。今年の中小企業診断士の経営情報システムで、ポリモーフィズムが出題されたのですが、勘違いしたような気がします・・・。言語の中で唯一資格をもっているJavaなのですが・・・。まっ、二度と間違うことはないでしょう・・・。
では、また!!!