• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC#で汎用的な関数はどのファイルに書くのですか?)

VC#で汎用的な関数はどのファイルに書くのですか?

このQ&Aのポイント
  • VC#で汎用的な関数を書くファイルはどこですか?
  • VC#のWindowsフォームアプリケーションでの関数の書き方について教えてください。
  • VC#での関数の配置についてアドバイスしてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

VBAで言うところの標準モジュール的なファイルは好きなように作って良いでがす。 例えば、StringUtils.csというファイルを作ってその中に namespace Utils public class StringUtils { private StringUtils() { } public static bool isEmpty(string t) { return t == null || t.length == 0; } } などと書けばそれは全てのプログラムからUtils.StringUtils.isEmpty("test")などと呼び出す事ができる。上のコードはソラで書いたので細かい文法は間違っているかも知れないのでその時は適時直してください。この時、メソッド(関数)はpublic staticで定義しないとVBAの標準モジュール的に使う事ができない。また、private StringUtils()はプライベートコンストラクターと言って、このStringUtilsクラスをインスタンス化させない目的で使っている。 ただ、VBAのようななんちゃってオブジェクト指向な言語では標準モジュールはありがたい存在だったが、C#では可能な限り正統派オブジェクト指向なクラス分けを考えていくほうが良いだろう。

suffre
質問者

お礼

ありがとうございます。 まだ正統なオブジェクト指向がどういうものか理解しきれていませんが非常に参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

良し悪しの論議は置いといて、 どの言語でも、オープンソースやプロプライエタリ製品などソース管理では、 一般的にカテゴリ別にクラスを作り、staticメンバで実装するのが定石ではないかと思います。 どういうカテゴリにするかは技術者の裁量ですが、 文字列操作なら StringUtil、描画関係の操作ならGraphicsUtilなど。 クラス分けやネームスペースを理解し考えるのは、プログラミングの大事な工程の一つで、 オブジェクト指向を理解する上でも最も大事な部分です。 この作業は人によってはつまらない作業かもしれませんが、 理解できるようになってくると、プログラマの楽しみであると同時に、 エンジニアとしてのスキルとしても大変役に立つのでぜひお勧めします。 ジェネリックなどはSystem.Collections.Genericに入れる方も居られますが、 システムのクラスなのか独自クラスなのかわからなくなり煩雑になりますので、 自分の作るアプリのカテゴリに分けて定義したほうがよいと思います。 (jp.myapp.Generics.MyList<E>など。) また、クラス化するのはネームスペースの延長、最終的なカテゴリ分けをするためで、規模を隠蔽するためではありません。 よってどんなに小さいメソッドであっても汎用性があるものならばクラス化して集約したほうがよいと思います。 メンバ関数の数が増えてきたら自分のライブラリとして、外だしのライブラリプロジェクトをつくり、 ライブラリに署名を付けておくと、今後作るであろういろいろなアプリから利用できるようになると思います。 クラス名の命名としては、たとえばアプリケーションのネームスペースがjp.ahoo で、文字列を操作するクラスならば、 jp.ahoo.utils というネームスペースやパッケージの下に、クラス名 StringUtil などがあるでしょう。 ただ、外部クラス化することで処理が面倒になる場合もあります。パフォーマンスが落ちるのならば、 無理に外出しにする必要はないかもしれません。 スニペットなどもうまく利用してご自身が作られるコードをテンプレート化しておくのもよいと思います。

suffre
質問者

お礼

ありがとうございます。 とても丁寧で詳しく教えてくださって感謝します。

全文を見る
すると、全ての回答が全文表示されます。
  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

何でもかんでもクラスにする風潮には、懐疑的に考えています。 本来、クラスは、構造化プログラミングと同じく、プログラミングの時にいくつかのルールを課すことで、バグを減らし、見通しをよくしてデバッグをやりやすくするためのものなので、その目的に合わないものは、クラス化するべきでないと思っています。 たとえば、数学のSin関数を Math.Sin とクラスにするなどは、不必要に式の文字数を増やして見にくくし、デバッグを不便にする以外、何かの役に立つのか? とか。 では、どのようなものをクラスにするべきかというと、プロパティ、メソッド、という言葉がしっくりくる情報の集合体をクラスにするべきではないかと考えています。 たとえば、図形処理をするプログラムなら、三角形などのクラスをつくって、 TriAngle1.Axis=・・・ 等で、形を定義しておけば、あとは、 Menseki=TriAngle1.Area; として面積をもとめたり、 Kyori=TriAngle1.Distance(Triangle2); として別の三角形までの距離をもとめたり、 Triangl1.Display; で、画面に表示したり、 といった処理をするのは、自然なことでしょう。 オブジェクト指向という言葉は、それまでのプログラミングのスタイルが、処理・命令を基準に塊を作っていたのに対し、(質問者さんの、ファイル処理、文字処理でモジュールを作るという考え方です) 目的とする情報(これがObject。前の三角形の例)を基準に考えて塊をつくるという考え方です。 ファイル処理でも、それを処理で区切るのでなく「入力データの集合体」などと考えれば、自然なクラス化も可能ではないかと思います。 あくまで、無理のない範囲で、すこしずつオブジェクト指向に慣れていけばよいと思います。 オブジェクト指向、クラス、というものは、機械的に書き方を変えるのでなく、まず、考え方を変えることであると気づくことが大事でしょう。

suffre
質問者

お礼

ありがとうございます。 クラスについて非常に参考になりました。 無理にクラス化するのもいけないのですね。 >では、どのようなものをクラスにするべきかというと、プロパティ、メソッド、という言葉がしっくりくる情報の集合体をクラスにするべきではないかと考えています。 これを頭に入れておくようにします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [VC++]ヘッダファイルからの関数コール

    Formのボタンクリックイベント(Form.h)から 別ファイル(.cpp)の関数をコールしたいのですがうまくいきません、 どのようにすればよいでしょうか?ご教授お願いします。 1> : error C2144: 構文エラー : 'void' は ')' によって先行されなければなりません。 1> : error C2059: 構文エラー : ')' //----- main1.h #include <stdio.h> #include "Form1.h" namespace A { void main1(); } //----- main1.cpp #include <stdio.h> #include "main1.h" using namespace A; void main1() { //処理 } //----- Form1.h #include <stdio.h> #include "main1.h" void main1(void); namespace A { public ref class Form1 : public System::Windows::Forms::Form { public: private: System::Void btn_Click(System::Object^ sender, System::EventArgs^ e) { //★クリックイベントからmain1の関数コールしたい main1(void); } }; }

  • VC++6でfgets関数の変わりになるような関数はあるのでしょうか。

    現在、VC++6を用いて、MFC を使わずにアプリケーションを作っています。 アセンブラ経験はありますが、C言語経験がないので、四苦八苦しています。 今回、 csv形式のファイルを読込んで、配列に格納したいのですが上手くいきません。 c言語の場合は、fopen関数で開いたファイルを、fgets関数で1行づつ読込み、 strtok関数で、処理すれば良いということが分かりました。 ところが、VC++6のCreateFile関数では、ファイルのポインタの変わりに、 クラスのハンドルが返ってくるので、fgets関数は使えないような気がします。 なにかfgets関数の変わりになるような関数はあるのでしょうか。 質問の意味が分かりずらいかと思いますが、適当に汲み取って教えて下さい。 宜しくお願いします。

  • VC++2010での開発について

    『Microsoft Visual C++ 2010 Express』をインストールして、 Windowsアプリケーションを作成したのですが・・・ 初期作成されたヘッダファイル(Form1.h)にいろいろとコードがかかれていました! 昔(VC6)時代が最後だったので少しびっくりしたのですが、 cppファイルに書いていたような内容がhファイルにあるので?となり質問しました。 質問内容 1..NETになってからは、hファイルにイベントやコンストラクタなどの処理は記述するものなのでしょうか? 2.新規関数を作成する場合はどうするの? 3.VC++ 2010を勉強するにあたって、参考になる『本』『サイト』はありますでしょうか? よろしくお願いいたします。

  • Visual Studio 2008 で VC++ .NET を使って

    Visual Studio 2008 で VC++ .NET を使って開発をしています。 クラスについて現在勉強しているんですけど、早速詰まってしまいました。 『クラス内のメソッドを呼び出す時に、Form1等のフォームを指定し、クラス側ではそのフォームにボタンを配置する。 配置して、そのボタンをクリックされると、ダイアログで「Hello World!」と表示する』 このようなソフトを作りたいのです。(特に意味はなく、勉強したいため) ボタンの配置までは出来るんですが、「クリックされると」の部分が出来ません。 今までは、(クラス使ってないときでは) this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); など、 EventHandlerにthisを与えていたのですが、クラスだとthisが使えなくて困っています。 分かる方お願いします (コードはNGワード扱いされたので、URLを張ります。) http://azio.web.fc2.com/code.txt

  • OnInitDialog()の関数の組み込み方

    Visual Studio2005でC++のプログラミングを始めました。 (今まではVC++6.0を使っていました。) リソースエディタでダイアログを作り、新規クラスを作った後 このクラスにOnInitDialog()の関数を追加したいのですが リソースのプロパティのメッセージにはWM-INITDLGがありません。 どのようにして、この関数を追加しますか?

  • VC++のコーディングについて

    VC++初心者です。 VC++のWindowsフォームアプリケーションを使用してテストプログラムを作ってみようと思っています。 初歩的な質問ですみません。 VC++でWindowsフォームアプリケーションを作成する場合、 フォームのヘッダーファイル(Form.h)にコーディングしていくものなのでしょうか? ボタンクリック処理など、ヘッダーファイルに作成されてしまいます。 私の先入観で、cppファイルにコーディングするものだと思っていたのですが、 VC++のWindowsフォームアプリケーションとは、こういうものでしょうか? ヘッダーファイルにコーディングするという感覚が何だか気持ち悪いです。 また、VC++を使用してWindowsアプリケーションを作る勉強がしたいのですが、 「初心者でも分かる+オススメの参考書籍」がありましたら、教えていただけると幸いです。 基本的な質問で意味不明かもしれませんが、ご回答いただけると助かります。 よろしくお願いします。

  • VC++

    フォームアプリを作成しており、実装に関して不明点があるため質問させて頂きます。 やりたいこととしては、Formでないファイル(クラス)でFormのコンポーネントを 操作したいことです。 具体的に、重たい処理を別スレッドで処理させて、処理中の経過をFormの プログレスバーに表示することです。 重たい処理は別ファイル(クラス)で行います。 以下に大まかなコードを記載します。 ----------------------------------------------------- ---- Form.h ---- #include "Main.h" namespace XXX { public ref class Form1 : public System::Windows::Forms::Form {  Main^ mMain;    // ボタン押下  private: System::Void btn_Click(System::Object^ sender, System::EventArgs^ e) {   backgroundWorker1->RunWorkerAsync();  }  // ワーカ  private: System::Void backgroundWorker1_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) {   mMain->func();    } }; } ---- Main.c ---- Main::func() {  // 処理をしつつプログレスバーのValueを更新 } ----------------------------------------------------- 重たい処理をForm内で処理するのであればデリゲートを使用すれば出来そうです。 上記のようなケースでも適用できますか? また、別の方法があれば教えてください。

  • 【c++】関数の仕様を出力

    クラス内で作成している各関数の仕様をファイルとして出力したいです。 Visual studioを使っていると、 ツールで「クラスビュー」や「オブジェクトブラウザ」などで関数の仕様などが出力されると思います。 Visual studio の機能でも、外部ツールの機能でも良いです。

  • vc++ 関連

    ぼくは今vc++2008 を使っています. デバッグなしで実行だとでエラーになるのに デバッグだとエラーにならない というわけのわからないバグで混乱しています. デバッグモードだとエラーが出ないので バグが見つけられなくて困ってます. そういう事ってあるんですか? ちなみにエラーメッセージは Debug Assertion Failed! Program: ...ments\Visual Studio File: c:\program files\microsoft visual studio 9.0\vc\include\list Line: 218 Expression: list iterator not dereferencable です.

  • VC++2010 expressでファイル操作

    VC++2010 expressでテキストファイルを開いて、文字を1個ずつ読み取っていくプログラムを作りたいのですが、VCではどのようにファイル操作を行うのかがわかりません。以前使っていたCでは、 int main(){    FILE *fp    fp=fopen("test.txt","r") if( fp == NULL ){    printf( "%sファイルが開けません¥n", fname );    return 0;    } /* 以下に処理が続く */ とやっていたのですが、VC++ 2010 expressでフォームに実行ボタンを1つ作って、 Form1.hを開き以下のように書いて実行するとエラーが出ます。 #pragma once namespace サンプル{  /* (中略) */ #pragma endregion private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { FILE *fp;       fp = fopen("test.txt", "r" ); if( fp == NULL ){    msgbox *fname+L"ファイルが開けません";    return 0; } } }; } 既にFILEの宣言からおかしいみたいなのですが、 どのように書けば正解なのでしょうか? 具体的なコードとコードを書き込む位置を明示してご教示ください。 #大変申し訳ありませんが、「○×をすればいい」等、具体的なコードが書いていない、 #コードを書く位置を明示していないコメントや、これでは拡張性が無い等の #上級のコメントはご遠慮ください。たぶん読んでもわかりませんので。