★ExcelVBA・AccessVBA ~ 再度、ChatGPTに質問してみました。「VBAは手続き型言語?オブジェクト指向?」「他の言語は?」「”完全”なオブジェクト指向型の言語はある?」「逆に”完全”な”手続き型(プリミティブ型のデータしか扱わない?)”の言語はある?」
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
ついでに、VBAが手続き型プログラミング言語なのか、オブジェクト指向プログラミング言語なのか、どちらなのかも聞いてみました。
正しいかどうかわかりませんけど、「まあ、確かにそうかも・・・」という感じの、割と納得はできる内容でした。
「どうせ誰かに聞いても、ここまで詳しく明確に、また、(自分がメインで使う言語などに対して)そこそこ忖度無しに教えてくれる人は居ない」と考えると、「ある程度の基準」としては受け入れていいのかも?です。
ただ、「ハイブリッド」なんて言葉を使えるようなものだろうか?という部分はひっかかりました。それを言ったら、他の言語だって同じものがあると思うので・・・。
なので、それも聞いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 |
' ' 【質問】 VBAは手続き型プログラミングですか?それともオブジェクト指向プログラミング(OOP)ですか? ChatGPT: とても重要でよく出る質問ですね。結論から言うと、 **VBAは「手続き型プログラミングをベースに、 限定的なオブジェクト指向プログラミングの要素を持つハイブリッドな言語」** です。 ◆1. 基本は「手続き型」 VBAはもともと、 **「Visual Basic」=手続き型言語(Procedural Language)** の流れをくんでいます。 Sub や Function を使って、手続き(順番に実行される処理)を組み立てる グローバル変数やモジュールレベル変数が普通に使える ステートメント(If、For、Doなど)を順番に記述していく これは まさに手続き型の特徴です。 ◆2. しかし「オブジェクト指向の要素」もある ただし、VBAは次のような点で オブジェクト指向的な機能も持ちます: Excelなどのアプリケーションの機能が「オブジェクト」として提供されている (例:Workbook、Worksheet、Range など) それぞれのオブジェクトに「プロパティ」「メソッド」「イベント」がある Set を使って、オブジェクト変数に「参照(ポインタ)」を代入する クラスモジュールで、自作クラス(カスタムオブジェクト)を定義できる つまり、オブジェクトを「使う」ことは完全にオブジェクト指向的ですし、 「作る」ことも可能です(ただしC#やJavaほどではない)。 ◆3. しかし「本格的なOOP言語」ではない理由 継承ができない(他のクラスを基にクラスを作ることができない) ポリモーフィズム(多態性)も限定的 アクセス修飾子(Public, Private)はあるが細かいカプセル化はやや粗い インターフェース(Implements)機能もあるが制限付き つまり、OOP(オブジェクト指向プログラミング)の 学術的な定義には満たない部分も多いです。 ◆結論まとめ 観点 VBAの位置付け 手続き型 ✅ 中心的な特徴 オブジェクト指向 ✅ 限定的に対応(使える&作れる) 本格的OOP言語(C++やJavaなど) ❌ そこまでは届かない ◆補足:あなたのような「深い理解」が意味を持つのはここ VBAのような「ハイブリッド型」言語では、 **どこまでが手続き型で、どこからがOOPなのか?**を理解しておくことが極めて重要です。 あなたが以前おっしゃっていたように、「クラスモジュールにたどり着けるかどうか」が、 VBAを“ツール”として使うだけか、“プログラミング”を学ぶのかの分かれ目です。 質問や深掘りたい方向があればどんどん聞いてください! ========================= 【質問】 そういう意味なら、「Python」や「JavaScript」なども「ハイブリッド型」? 「JAVA」はどうなんでしょう? ChatGPT: ナイスな視点です! その通り、「Python」や「JavaScript」、 そして「VBA」も含めて、ハイブリッド型の言語って考えるのが本質的です。 詳しく見ていきましょう。 🔹 Python:ハイブリッド(手続き型 + オブジェクト指向) 関数を書いて手続き型っぽくも使えるし クラスを定義して本格的なOOP(継承、ポリモーフィズム含む)もできる → しかも、すべてがオブジェクトという特徴もある(int型ですらオブジェクト)。 🔹 JavaScript:ハイブリッド(手続き型 + オブジェクト指向 + 関数型) 伝統的には手続き型がベースだったけど、 prototypeベースの**オブジェクト指向(classなしでもOOP)**があり、 関数を第一級オブジェクトとして扱える → 関数型プログラミングも可能 → 最近ではES6以降で class 構文も使えるようになって、OOPしやすくなった。 🔹 Java:基本は「純粋なオブジェクト指向」にかなり近い すべてがクラスの中で書かれる(関数もクラスの中に入れる必要がある) ただし、プリミティブ型(int, doubleなど)だけは例外的にオブジェクトではない → そのため「完全なOOP」ではないけど、OOP寄りな言語設計。 🔸 総まとめ:分類のざっくり感覚 言語 OOP対応 手続き型対応 関数型対応 コメント VBA △(一応クラスある) ◎ × ハイブリッドだけどOOP弱め Python ◎ ◎ ○ 非常に柔軟なハイブリッド JavaScript ◎ ◎ ◎ 3スタイルすべて可 Java ◎(ほぼ専念) △(クラス必須) △ OOP中心の構造 C++ ◎ ◎ △ マルチパラダイムの代表格 Haskell × × ◎ 関数型の王様 つまり、あなたの感覚は正しいし、 「ひとつの型に決めつけずに、どんなスタイルが得意なのか」を 見極めることが大切ってことですね。 気になる言語が他にもあれば、比較表に追加してもOKですよ! プログラミング言語のざっくり分類表(OOP観点) 言語 OOPレベル 備考・スタイル Smalltalk 🔥完全OOP すべてがオブジェクト。構文すらオブジェクトのメッセージとして扱う。OOPの源流。 Ruby 🔥ほぼ完全OOP 数字やtrue/falseもオブジェクト。制御構文もメソッド風に書ける。柔らかい構文。 Python ⚙️ハイブリッド OOPが可能かつ強力だが、プリミティブや手続き型も併用可能。とても柔軟。 JavaScript ⚙️ハイブリッド 関数型とOOPのどちらもサポート。プロトタイプベースのOOP。 Java 🧱強力なOOP クラスベースOOP。プリミティブ型は非オブジェクトだが、ラッパーで補完可。 C# 🧱強力なOOP Javaに似ているが、よりモダン。プリミティブはあるが、OOPの整合性が高い。 VBA 🔧ハイブリッド/限定OOP クラスモジュールあり。ただし継承などは不可。主に手続き型。 C++ 🛠️マルチパラダイム 手続き型+OOP+関数型も可能。柔軟だが設計者の力量に依存。 Go 🪛構造体ベース クラスなし。OOP風の設計は可能だが、明示的なOOP機構(継承など)はなし。 Rust ⚙️構造体+トレイト 型安全と並列性に強い。OOPスタイルも可能だが、あくまで構造体+トレイト主体。 Haskell 🌊関数型中心 OOPは非主流。関数型言語だが型クラスの考え方がOOPに通じる部分も。 C言語 🔩完全な手続き型 関数と構造体のみ。クラスや継承などのOOP構文なし。 Fortran(初期) 🔩完全な手続き型 科学技術計算に強い。OOPはFortran90以降。 Pascal(標準) 🔩完全な手続き型 教育向けに設計。Object PascalはOOPだが、標準Pascalは純粋な手続き型。 BASIC(初期) 🔩完全な手続き型 初期のBASICはGOTOベースの手続き型。OOP構文なし。 Assembly(全般) カテゴリ 🔥 完全OOP:構文・制御構造・データすべてがオブジェクト。 ⚙️ ハイブリッド:複数パラダイム(OOP/手続き型/関数型)を選択可能。 🧱 強力なOOP:クラス設計中心。OOP原則に忠実。 🔧 限定OOP:クラスは使えるがOOP要素が一部制限。 🛠️ マルチパラダイム:OOP、手続き型、関数型などをミックス可能。 🪛 構造体中心:クラスなし。構造体+メソッド/インタフェースなどで設計。 🌊 関数型中心:副作用を排除し、関数の合成を重視。 🔩 完全な手続き型:関数・命令・手続き中心。クラス/OOP要素なし。 (※↑つまり、「プリミティブ型のデータしか」扱わないってこと?かも?) ========================= 【質問】 あなた: では「完全なOOP」の言語・・・というものは存在するのでしょうか? ChatGPT: めっちゃ良い質問です! 結論から言うと── 「完全なオブジェクト指向言語」は存在するが、極めて少数です。 しかも実用性ではトレードオフがある場合も多い。 🌐 「完全なOOP言語」って何を意味する? まず「完全なオブジェクト指向言語(pure object-oriented language)」とは: すべてがオブジェクトである 演算子・制御構文(if, whileなど)すらオブジェクトで処理される プリミティブ型が存在しない 外部とのやり取りもすべてオブジェクトを通じて行われる 🏆 代表的な「完全なOOP言語」 🔹 Smalltalk(スモールトーク) OOP言語の元祖。完全にオブジェクトで構成される世界。 文字列、数値、ブール値、制御構文、全部オブジェクト。 現代OOPの基本思想(メッセージパッシングなど)はここから来た。 3 + 4 すら「3に+というメッセージを4で送る」という考え方。 🔹 Ruby(ほぼ完全なOOP) ほとんどすべてがオブジェクト。 5.times { ... } みたいに数字ですらオブジェクト。 制御構文は構文として存在するけど、それもクラスで模倣できる部分が多い。 → 純粋OOPにかなり近い。 **「Smalltalkの精神を引き継いだモダンOOP」** と称されることも。 🔸 「完全なOOP」があまり使われない理由 実は、「完全さ」は実用性とトレードオフになることがあります。 完全なOOPの特徴 実際の課題 すべてがオブジェクト パフォーマンスが落ちることも 演算子や制御構文もオブジェクト扱い 学習コストが高くなる 抽象度が高くてエレガント 初心者や業務ツール開発に不向きな場合も ✅ 実務では「柔軟なハイブリッド型」が主流 だからこそ、PythonやJavaScript、C#、Javaといった「OOPに強いけど、 必要なら手続き型や関数型もできる」柔軟な言語が実務では主流なんです。 💬 まとめ 完全なOOPは存在する(Smalltalk、ほぼRuby) でも、実務や学習のバランスを考えると、ある程度ハイブリッドな言語が現実的 VBAはOOPを学ぶ導入口としても活用できるが、限界もある(特にクラスの拡張性) 他にも気になる言語があれば掘り下げますよ! また、SmalltalkとかRubyの「OOP精神」だけを他言語に活かす話もできます。 ' ' |
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, AccessVBA, Accessの独学, Access操作の基礎, Accesの独学, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, SQL, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化