近頃のソフト開発について

,

オブジェクト指向は使うな、関数型プログラムが良い、Flutterがモバイル開発では良さそうなどの話がありますが、若干疑問です。

1)オブジェクト指向は使うな?

 CADを作って居た経験では図形(line/polygon/circle/arc/parts。。。)などの図形要素をベースクラスから継承して定義・使用します。これをオブジェクト指向なしで作るとifやcase文のオンパレードで、ソースも無駄に長くなります。

 また、私がCからC++に移行したのはSTLを使いたかったからです。以前はCADのデータをCのポインターを駆使して作成していたのでが、STLで簡単に記述できました。

 その様な経験から「オブジェクト指向は使うな」「継承は使うな」などの意見には非常に違和感があります。向いて居ない事に無理やり使おうとした「間違った使い方」をした人々の戯言ではないのかと思いGEMINIさんに聞いてみました。概ね同じ感想ですね。

<質問>
オブジェクト指向のプログラミングは良くないとの話題が多数あります。何が悪いのですか? CADなどで図形を使用する場合、オブジェクト指向でないととんでも無いプログラムになるので、オブジェクト指向は有用と思って居ます。

<回答>
オブジェクト指向プログラミング(OOP)が「良くない」という意見が散見されるのは、その万能性に対する誤解や、不適切な適用による弊害が原因として考えられます。

OOPの利点とCADにおける有用性

ご指摘の通り、CADのように図形を扱うようなシステムでは、OOPは非常に有効なパラダイムです。
・図形のモデリング: 図形をオブジェクトとして表現することで、図形の属性(色、形状、位置など)や操作(移動、回転、拡大縮小など)をカプセル化できます。これにより、コードの再利用性が高まり、複雑な図形も扱いやすくなります。
・継承による拡張: 基本的な図形(円、矩形など)を基底クラスとして、より複雑な図形を派生クラスとして定義できます。これにより、コードの重複を減らし、保守性を向上させることができます。
・多態性による柔軟性: 異なる種類の図形に対して、共通のインタフェースで操作できるため、プログラムの柔軟性が向上します。

OOPに対する批判と注意点

一方で、OOPに対する批判として、以下のような点が挙げられます。

・過剰な設計: OOPの概念を過度に適用し、複雑なクラス構造を作り込んでしまうと、かえってコードが理解しづらくなり、保守性が低下する可能性があります。
・学習コスト: OOPには、クラス、オブジェクト、継承、多態性など、理解すべき概念が多いため、初学者にとっては学習コストが高い場合があります。
・パフォーマンス: 一部のケースでは、OOPによるオーバーヘッドがパフォーマンスに影響を与えることがあります。

OOPを効果的に活用するために

OOPは万能ではありません。問題の性質や規模に合わせて、適切なプログラミングパラダイムを選択することが重要です。

・必要以上に複雑な設計は避ける: シンプルな問題に対しては、過度にOOPにこだわる必要はありません。
適切なクラス設計: クラスの責務を明確にし、カプセル化を徹底することで、保守性の高いコードを作成できます。
・継承の濫用を避ける: 継承は強力なツールですが、誤った使い方をすると、コードの結合度が高まり、変更が困難になります。
・パフォーマンスを意識する: パフォーマンスがクリティカルな部分では、OOPのオーバーヘッドを考慮し、必要であれば他のプログラミング手法を検討する必要があります。
まとめ

OOPは、CADのような複雑なシステムを開発する上で非常に有効なツールです。しかし、万能ではありません。その利点を理解し、適切に活用することで、より良いソフトウェアを開発することができます。

2)関数型言語が良い?

私が本格的なプログラムミングを始めたのはAPLを使用した図形処理でした。いままでのどの言語よりも短く図形処理(=行列処理)を書けます。1行でC++の数百〜千行程度の処理が書けました(=Pythonのnumpyを使っても数百行かな)。ある意味究極の関数型?言語ですが、殆ど使われて居ません=非常に見にくく、作った本人でも3日で何をしているか分からなくなります。

なのでGEMINIさんに聞いてみます。まあAPLは特殊すぎて普及しないのは当たり前ですが、物理学科などの学生ならば覚えておいても良いかもです。

<質問>
関数型プログラミングが良いとの話がよく出てきます。それならばAPLがもっと普及しても良さそうな気がします。何が関数型プログラムが良いのですか。非常に見にくい様に感じます

<回答>
関数型プログラミングが注目されている一方で、APLのような言語が普及しないのは興味深い点ですね。ご指摘の通り、APLの記法は慣れないと非常に難解に見えるかもしれません。

関数型プログラミングが注目される理由

関数型プログラミングが注目される理由は、主に以下の点が挙げられます。

・並行処理や並列処理との親和性: 関数型プログラミングは、副作用を最小限に抑えるため、複数の処理を並行して実行しても状態が複雑になりにくく、並行処理や並列処理との親和性が高いです。
・テストの容易さ: 関数型プログラミングでは、関数が純粋な計算を行うため、入力を与えれば必ず同じ出力が得られます。この性質は、単体テストを書きやすく、バグを見つけやすくすることにつながります。
・数学的な厳密性: 関数型プログラミングは、数学的な関数に基づいているため、プログラムの論理的な整合性を保証しやすく、より厳密なプログラムを書くことができます。
・大規模開発への適性: 関数型プログラミングは、モジュール化が容易で、再利用性が高いコードを書くことができます。そのため、大規模なソフトウェア開発において、開発効率や保守性を向上させることができます。

APLが普及しない理由

APLが普及しない理由は、以下の点が考えられます。

・学習曲線の高さ: APLの記法は非常に独特で、習得に時間がかかります。
・可読性の低さ: APLのコードは、慣れない人にとっては非常に読みにくく、理解が困難です。
・実行環境の制限: APLの実行環境は、他の一般的なプログラミング言語に比べて限られています。

関数型プログラミングとAPLの違い

関数型プログラミングとAPLは、どちらも関数という概念を重視していますが、いくつかの重要な違いがあります。

・抽象化のレベル: 関数型プログラミングは、高次の抽象化レベルでプログラミングを行うことを目指しており、一般的なプログラミング言語でも関数型プログラミングの要素を取り入れることができます。一方、APLは、配列演算を非常に強力にサポートしており、数値計算分野に特化した言語です。
・コミュニティ: 関数型プログラミングは、HaskellやScalaなど、活発なコミュニティを持つ言語が存在し、多くのライブラリやツールが開発されています。一方、APLのコミュニティは、比較的小規模です。

まとめ

関数型プログラミングは、現代的なソフトウェア開発において、その有用性が広く認識されています。しかし、APLのような言語が普及しないのは、その独特の記法やコミュニティの規模などが原因と考えられます。

関数型プログラミングのメリットを享受するためには、必ずしもAPLのような言語を選ぶ必要はありません。 現代の多くのプログラミング言語は、関数型プログラミングの要素を取り入れており、これらの言語を学ぶことで、関数型プログラミングのメリットを享受することができます。

もし、APLのような強力な配列演算機能に興味がある場合は、NumPyやPandasなどのライブラリをPythonで利用することも検討できます。

どちらのプログラミングパラダイムを選ぶかは、プロジェクトの要件や開発者のスキルセットによって異なります。 さまざまな言語やパラダイムに触れることで、より良いソフトウェア開発に貢献できるでしょう。

3)モバイル開発はFlutterか?

GeoDiveExaはXamarin(=C#)を使用して開発しました。現在はXamarinのサポートが切れたのでNetMAUIに移行中です。世の中を見てみるとモバイル開発としてFlutterの話題は多くありますが、日本ではNetMAUIの話は殆どありません。外国ではNetMAUIで「バグがある」「。。。が動かない」などの話題が多くあり、今後はFlutterに移行していくベキかなとも思われます。NetMAUIで「バグがある」「。。。が動かない」は、私も若干思うところは有りますが、Gitでソースも有るので、動かなければ、動く様に使えば良いだけで、本当に問題なら元ソースを自分用に修正すれば良いので「ど〜でも良い」気もします。

GEMINIさんにまたまた聞いてみます。Xamarinからの移行なのでGeoDiveExaはNetMAUI一択ですが、今後はFlutterも良さそうなので昔作って居たRunLoggerをFlutterで作り直して見ようかなと思います。

<質問>
モバイル開発環境としてFlutterとNetMAUIを比較して、おすすめを教えてください。

<回答>
Flutterと.NET MAUIは、どちらもクロスプラットフォームモバイルアプリ開発で人気のフレームワークですが、それぞれ特徴が異なります。どちらがおすすめかは、あなたのプロジェクトの要件やチームのスキルセットによって変わってきます。
特徴Flutter.NET MAUI
開発言語DartC#
UIレンダリング自前のレンダリングエンジンネイティブUI要素を利用
開発環境Visual Studio Code, Android StudioVisual Studio
コミュニティ活発、特にGoogleのサポートが厚い.NETコミュニティの一部、Xamarinからの移行組も多い
クロスプラットフォーム対応iOS, Android, Web, DesktopiOS, Android, macOS, Windows
ホットリロード빠르고 원활빠름
UIデザインMaterial Design, Cupertino (iOS)XAMLによるカスタムUI作成が可能
パフォーマンス高いネイティブに近いパフォーマンス
学習コストDartの学習が必要C#の知識があれば比較的入りやすい
比較表
Flutterのメリット
・高パフォーマンス: 自前のレンダリングエンジンにより、ネイティブアプリに匹敵する滑らかなUIを実現できます。
・ホットリロード: コードの変更を即座に反映できるため、開発効率が非常に高いです。
・豊富なUI部品: Material DesignやCupertinoなど、様々なデザインのUI部品が用意されています。
Web開発との親和性: Dart言語はWeb開発にも利用できるため、Web開発経験者にとっても学びやすいです。

.NET MAUIのメリット
・C#による開発: C#は企業での利用実績が多く、多くの開発者が慣れ親しんでいる言語です。
・.NETエコシステムの活用: .NETの豊富なライブラリやツールをそのまま利用できます。
・ネイティブUI: ネイティブUI要素を利用するため、プラットフォーム固有の機能をより簡単に利用できます。
・Xamarinからの移行: Xamarin.Formsからの移行が比較的スムーズに行えます。

どちらを選ぶべきか?
・C#に慣れている場合、.NET MAUI: C#のスキルを活かしたい場合、.NET MAUIがおすすめです。
・高パフォーマンスを求める場合、Flutter: ネイティブアプリのような滑らかなUIを実現したい場合、Flutterがおすすめです。
・Web開発経験がある場合、Flutter: Dart言語はWeb開発にも利用できるため、Web開発経験者にとっても学びやすいです。
・大規模開発で安定性を重視する場合、.NET MAUI: .NETの成熟度と豊富なコミュニティは、大規模開発において安定性を担保する上で有利です。

まとめ
Flutterと.NET MAUIは、どちらも優れたクロスプラットフォームモバイル開発フレームワークです。どちらを選ぶかは、プロジェクトの要件やチームのスキルセット、そして将来的な展望などを総合的に判断する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP