X



ふらっと C#,C♯,C#(初心者用) Part130 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001ななしぃ♯ 転載ダメ©2ch.net (ワッチョイ 93aa-SrFS)
垢版 |
2017/07/18(火) 06:40:45.47ID:mH9qbH+m0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。

なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part129
http://mevius.2ch.net/test/read.cgi/tech/1497000961/

■関連スレ
C#, C♯, C#相談室 Part94 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1492843013/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0852デフォルトの名無しさん (ワッチョイ 0311-X0kF)
垢版 |
2017/09/02(土) 21:50:00.25ID:TQXuPiZd0
>>842
C#に決まった由来は気になるので時間あるときにみてみます

>>843
となると遅かれ早かれ必要になりそうですね
学ぶタイミングが難しい気もしますが

>>844
もともとその用途で購入を考えてましたが周りの方が言う通り
ネットの恩恵に預かろうかと思います

>>846
参考になる経験談ありがとうございます
WEBの勉強で不足を感じたら独習→イディオムのように勧めていこうかと思います
0853デフォルトの名無しさん (ワッチョイ ffea-dgwg)
垢版 |
2017/09/02(土) 22:08:20.57ID:E5+eBi390
>>847
勉強の基本なんだけど。
「分からない」時にはなにが分からないかを列挙して、それをさらに細かい要素に分解していく。
分解して考えれば・調べれば分かるようになったら、それをひとつひとつ解決していく。

847 を読んでもなにが分からないのかこちらに伝わらない。
つまり自分でなにが分からないのか分かってないんでしょ。
もっと整理してみたら?

ちなみに新人というか数年程度のヤツにそんなたいしたことは求めてない。
きちんと適切な質問を出来るようになればそれで OK だと思うよ。(ちょー難しい要求だが)
特に1年目なんて、なにを聞いても許される二度とない重要な期間なんだから、それを有効活用しない手はない。
最悪なのは自分で抱え込んでなにも進まない状態だよ。
0854デフォルトの名無しさん (ワッチョイ ff11-BPzU)
垢版 |
2017/09/02(土) 22:11:52.21ID:9PaYDv7F0
>>849
今できることよりも
継続して勉強できるかどうかのほうがずっと大事
1~2年継続して勉強すれば周りのやつ全員追い抜けるよ

ただし基礎的な能力が高いやつに限るが
(論理的思考力、自然言語能力、メタ認知能力等)
0858デフォルトの名無しさん (ワントンキン MM9f-ysE7)
垢版 |
2017/09/02(土) 22:46:27.15ID:w/8WFstaM
無能な働き者に分類される人は自然言語に傾倒しがちだよね
ダラダラと長く曖昧でわかりにくい文章が数式なら僅かな記述で明確に表現できることもある
理解するのに時間がかかる難解な文章が図表なら瞬時に把握できることもある
もちろん自然言語を全て否定する訳ではないがバランス感覚は大事なんだな
自然言語はあくまでツールのひとつ
0859デフォルトの名無しさん (ワッチョイ 0311-nZMq)
垢版 |
2017/09/02(土) 22:52:16.04ID:o1ErZR2S0
最近、イディオム買って読んでるけど、この本読んでる方って多いんでしょうか?

独習C♯読んでから、独学で色々とプログラム作ってましたけど、
OOPの考え方とかまったく知らないでやってたもので、コードが散らかってます
staticおじさんになってたり、クラス分けても結局再利用しないような内容、関数コピペ
メインメソッドから分離してるだけで、メインメソッドに膨大な量書いてるのと大差無い感じです

再利用の仕方とか勉強する為にイディオム本どうかなって見ましたが、みなさんはどの様に覚えたんでしょうか?
0863デフォルトの名無しさん (ワントンキン MM9f-ysE7)
垢版 |
2017/09/02(土) 23:05:22.40ID:w/8WFstaM
>>859
再利用は出来れば良いね程度の気持ちで
クラス分けの目的は色々あるけど主に責務の分割な

例えばパソコンに暖房がついてたら嫌だろ
持ち運びもできず
夏場は邪魔になるだけ
暖房機能が壊れたら壊れてないパソコン部分もまとめて修理に出さないといけない
普通と勝手が違うから暖房の起動方法がわからない(セットのパソコンでコントロール?リモコン?)
パソコンを拡張したいけど暖房機能を壊してしまわないか不安になる
問題だらけだ

だからパソコンとエアコンに責務を分けようってわけ
これなら先に挙げたようなアホくさい問題が全部解決するだろ
0864デフォルトの名無しさん (ワッチョイ 0311-nZMq)
垢版 |
2017/09/02(土) 23:17:35.26ID:o1ErZR2S0
>>863
機能の分離でクラス分けすると今度は必要なクラス探すの大変になる感じですかね?
後はどこまで繋げてどこから分離するかも中々難しく感じます

例えばエアコンのコレクションを扱うとして、エアコンの寒暖房機能、温度検知機能、タイマー機能、設定
などエアコンの中を細かくするのが苦手なんですよね
自分がよく作るのは株価を扱うプログラムですが・・・
0865デフォルトの名無しさん (ワッチョイ 0311-Yonq)
垢版 |
2017/09/02(土) 23:22:10.23ID:Q8fEI/lK0
>>863
どうでもいいがテレビデオを思い出した

>>864
>中を細かくするのが苦手なんですよね
それはクラス設計つーより、要件定義の段階でないの
要件が明確なら、作るべきクラスも自然に決まって来るっしょ
0866デフォルトの名無しさん (ワッチョイ 636e-9zQU)
垢版 |
2017/09/02(土) 23:27:14.80ID:PfNbROPa0
>>864
オブジェクト指向設計の本質は、設計を人間の感覚に合わせることだよ
分けることを目的にしたらダメ
人間の直感は設計の指針として明確でわかりやすいし、
オブジェクトの単位が直感に合っている限りは破綻しない(というか、少々無理が出ても破綻したように感じない)
0867デフォルトの名無しさん (ワッチョイ e303-3JEm)
垢版 |
2017/09/03(日) 00:23:14.14ID:VHdSJmfv0
>例えばパソコンに暖房がついてたら嫌だろ

俺もそう思っていた時期があったけど
Skylake-XとVEGAの組み合わせだと真剣に暖房かもしれない
こういうのも出るし
https://www.apple.com/jp/imac-pro/

後、質問者に何か助言できるなら、オブジェクト指向はそんなに真剣にしなくてもよいよ
大事なのは手続き型プログラミングが
・データ構造
・制御構造
という二大要素で出来上がっていることに気づくこと
データ構造とアルゴリズムともいう
データ構造と制御構造をそれぞれ別々に思い描いて
その上で、データ構造と制御構造の両方を持つ「class」に分割するには
何処で切り分けたら一番「制御構造の見通しが良いか」を考える
大事なのは制御構造について意識することで、というのもオブジェクト指向でやると
データ構造の方は勝手にきれいになるから意識する必要はないのでね
C#のasync/awaitも制御構造をきれいに保つための仕組みだしね
最近の流行りというか、流れ、トレンド
0868デフォルトの名無しさん (ワッチョイ e303-3JEm)
垢版 |
2017/09/03(日) 00:28:40.22ID:VHdSJmfv0
なんであまりオブジェクト指向に肩入れしていると
この人はややこしい人だと思われる風潮
オブジェクト指向設計というのは
制御構造とデータ構造という二つのものを考えて
小分けにしてclassという一つのものにまとめる作業
と考えていいと思うよ
二つのものを綺麗に切って一つにして小分けにするのは
高度な作業かもしれないけど、十や百じゃなくて高々二つなんで
まぁ慣れです
0870デフォルトの名無しさん (ブーイモ MM67-9zQU)
垢版 |
2017/09/03(日) 00:57:51.36ID:ksmau7/rM
実装レベルの設計とドメインのモデリングの話がごっちゃになってる気がする
ドメインモデルはまず人間の感覚から入って、そこから実装に落としていく段階で制御構造の観点を入れていく感じだね
0871デフォルトの名無しさん (ワッチョイ 0311-nZMq)
垢版 |
2017/09/03(日) 01:05:30.75ID:8T0wjaPz0
ありがとうございます
OOPの人間の感覚に合わせる意識が大事であって、分けることを目的にしないってのは大事だなって思います
難しいですが・・・

そういう意味だと、プログラムを少し修正したい、機能追加したいって思った時にバグが出にくい、追加しやすい状態にしたいですね
OOPに拘りは特に無く、あくまでソース管理や生産性の向上が目標です
曖昧な目標なので、実現するための手段で手こずってますが

自分の作るプログラムは目的上、同じデータから色んな値を作ったり検証させるので、使いまわせるところは汎用性がほしいんですよね

毎回別のプログラム作るたびにプロジェクト作って一部関数使いまわし、既存プロジェクトのクラス参照で使ってますが、
いつの間にかプロジェクト別で関数が別物になってしまったり、参照クラスの仕様変更で他のプロジェクトに影響出たり、設計が大変なので・・・
0872デフォルトの名無しさん (ワッチョイ 23e5-ffya)
垢版 |
2017/09/03(日) 09:32:19.26ID:wl+VODG10
>>847
いまいるおっさんたちは就職する時点でアマチュアプログラマ歴10年以上だよ
新卒でプログラミング経験なしだと無能扱いされて当然

まずは答えを見つけて写経しろ
ペンでもキーボードでもいいから丸暗記するまで書き写せ
話はそれからだ

ちなみにベテランだったら30秒ぐらいで作るぞ
0874デフォルトの名無しさん (ワッチョイ 0311-Yonq)
垢版 |
2017/09/03(日) 09:50:38.93ID:evIIJ2cg0
高校から始めたから、新卒時点で10年以上では無かったな
大学から始める様な人もいるし、適当言い過ぎだろ

新卒未経験は流石に、採用されてもPGじゃなく別部署に回される気がするが
0875デフォルトの名無しさん (ワントンキン MM9f-ysE7)
垢版 |
2017/09/03(日) 10:30:41.79ID:QlhluFUqM
新人は研修する前提だから最初からそんなに高度なことはできなくてもいい

実験データのテキスト読み込んでデータベース化しましたとか
サークルのWebサイトをメンテナンスしてましたとか
論文書くために自力でLinux TeX環境整えましたとか
エロ画像収集ツール自作しましたとか
そういう学生らしい微笑ましいIT体験談を聞ければ充分
あとはやばそうな精神疾患とか障害がなければ合格だね

ただし
何にもしてこなかったけど興味と熱意はありますってやつと
エクセルでマクロ組んでましたをやたら強調する意識たかそうなやつ
プログラムは書かないけどITパスや基本情報をアピールするやつ
これは地雷なのでその場で不採用にチェックします
0879デフォルトの名無しさん (アウアウイー Sac7-X0kF)
垢版 |
2017/09/03(日) 11:53:04.09ID:0sJDT6fHa
オブジェクト指向はプロジェクトが大きくなるほどベストの設計は存在しないんじゃないかと思う
ベストを目指しベターを繰り返していくけど結局正解はないと思い知らされる
0880デフォルトの名無しさん (ワッチョイ 0311-Yonq)
垢版 |
2017/09/03(日) 11:55:32.51ID:evIIJ2cg0
成果物に問題がなくて、そこそこ保守性が良ければ
無理にベストを目指す必要も無いからね

ベターをベストにする労力を掛けるより、
その労力で別の事をした方がいい
0882デフォルトの名無しさん (ブーイモ MM67-9zQU)
垢版 |
2017/09/03(日) 12:21:22.74ID:ksmau7/rM
変更のしやすさって開発スタイルに依存するからなあ
システムを作る側とそれを利用する側とで責任が分かれてる体制下においては、
綺麗なドメインモデルを継続的に改善し続けるなんて不可能
ひたすらコントローラでSQLを垂れ流す方が遥かに変更しやすい
0885デフォルトの名無しさん (ブーイモ MM67-9zQU)
垢版 |
2017/09/03(日) 13:53:29.42ID:ksmau7/rM
設計フェーズでちゃんと客と握ってれば仕様変更は客に相応のコストを請求すればいいでしょ
変更にかかる工数はトランザクションスクリプトなら高精度で簡単に見積もれる
変更しない前提ならテストなんか画面でポチポチしてExcelにスクショ貼り付けた方が早い
>>882で変更しやすいと言ったのは運用保守フェーズに入ってからの話ね
0889デフォルトの名無しさん (ワッチョイ f36c-X0kF)
垢版 |
2017/09/04(月) 18:45:09.41ID:hB0i/ETq0
List<int> suuji に入ってる一桁、数百の整数リストを3個ずつに纏めて新たなList<int> suujibunkatuに入れる作動を希望
C#の仕組みを理解するためにいろいろな方法を試しています
以下ソース

List<int> suuji = new List<int>();
//この後、suujiにはLoopで回した一桁の数字が数百入ります
List<int> suujibunkatu = List<int>();
foreach (var unit in suuji.Chunks(3))
{
Console.WriteLine(unit);
suujibunkatu.Add(unit);
}

//以下ネットからコピペした拡張メソッド
public static class Extensions
{
// 指定サイズのチャンクに分割する拡張メソッド
public static IEnumerable<IEnumerable<T>> Chunks<T>
(this IEnumerable<T> list, int size)
{
while (list.Any())
{
yield return list.Take(size);
list = list.Skip(size);
}
}
}
0890デフォルトの名無しさん (ワッチョイ f36c-X0kF)
垢版 |
2017/09/04(月) 18:45:33.53ID:hB0i/ETq0
やりたいことはforeachの中でList<int>suujibunkatu に三個ずつに纏められたunitの中身を次々に入れていく作動です
ここで、以下のエラーがでます
引数 1: は 'System.Collections.Generic.IEnumerable<int>' から 'int' へ変換することはできません。
場所はsuujibunkatu.add(unit)のunitに赤線になります
引数1 はList<int> suujiの最初の数字である1だと思います。

どうやって解消したら良いでしょうか?
unitに入ってるのがint[]のような配列だと思うのですが…それが原因なのかもわかりません
int[]に入ってる配列をint化する必要があるという感じでしょうか?
拡張メソッドの中身はまだ理解できてないので、拡張メソッドの方を改造しない方向で、のちのち拡張メソッド内を把握していこうと思っています
3つずつまとめる他の方法は出来るのですが、この拡張メソッドの中身を把握するために、使う部分でのエラーをなくしたいと思ってます

よろしくお願いします
0906デフォルトの名無しさん (ワッチョイ 6311-7QJT)
垢版 |
2017/09/06(水) 01:29:30.86ID:nkmkM8Yj0
練習でコンソールアプリケーションで迷路のようなのを作ってます
開始からゴールまでの時間を表示することはできたのですが、これを毎回記録しつつ、あなたは○○秒です〜現在○位です!
のようなランキングを表示できたらと思ってますが、どのような方法が考えられるのでしょうか?
0907デフォルトの名無しさん (ワッチョイ 0311-nZMq)
垢版 |
2017/09/06(水) 01:46:25.57ID:t+GbP5lP0
>>906
MySQL使ってDB構築してるわ

DB構築、そこからプレイヤーのidをキーに保持して、秒を保存すればええんでね?
ランキングはListとかでソートしてインデックス+1で表示
同率とかの処理必要ならメソッド作る感じで

オススメのDBはよく分からないけど
0908デフォルトの名無しさん (ワッチョイ ff11-BPzU)
垢版 |
2017/09/06(水) 02:18:50.02ID:x6m+UIsj0
>>906
1. 記録はファイル出力/ 順位表示時に毎回ソート
2. SortedList等を使って記録時にソート済みでファイル出力、起動時等にSortedListの構築が必要
3. DBに記録、順位表示はDBからソートした結果を取得して表示

自分だけでプレイするのなら1で十分だと思うが
練習なら上から順番にやっていくのでもいいかもね
DB使うならSQL CEかSQLiteかな
0913デフォルトの名無しさん (ワッチョイ 6311-ygYq)
垢版 |
2017/09/06(水) 18:48:35.84ID:yZhXwa1n0
@ 記憶媒体からデータを読み込む。読み込んだ順番を保ちつつリストを作成する
A ゲーム開始→終了
B @のリストの先頭から見て行き、新しい記録より大きい要素の1つ前に挿入する。(挿入した位置が順位)
C 表示処理
D リストデータを記憶媒体へ書き込む

ソートは不要。
DBを使う要件がないのであれば記憶媒体はtxtファイルで十分。
0914デフォルトの名無しさん (アウアウイー Sac7-b8Mh)
垢版 |
2017/09/06(水) 19:04:59.84ID:s9ZfYQxla
>>906
テキストファイル名に名前秒数を適当な区切りを入れて保存

山田,60,田中,75,伊藤,81.scr

エクスプローラーからF2で編集可能
エディタもいらない
もちろんファイル名に使えない文字はあらかじめ除外だ
0915デフォルトの名無しさん (ワッチョイ 6f6d-bdum)
垢版 |
2017/09/06(水) 23:29:32.24ID:kZeUfc0W0
ネットを見ていたら、インターフェースで依存性を排除するコードが
例として出ていたのですが「コンストラクタでengineに実装を注入する」とある部分は、どのように書けるのでしょうか?

インターフェースには実装が書けず、コンストラクタでメソッドを書くこともできないので見当がつきません

よろしくお願いします

public interface Engine
{
void start();
}

public class Car
{
public Engine engine;
public Car()
{
// コンストラクタでengineに実装を注入する
}
public void go()
{
engine.start(); // <- Engineはインターフェースなので依存性がなくなった
}
}
0916デフォルトの名無しさん (ワッチョイ e303-3JEm)
垢版 |
2017/09/06(水) 23:38:07.92ID:ygscOEFy0
Engineインターフェースを実装したエンジンのインスタンスを
何らかの手段で手に入れてengineに代入しろってことだな

つまり、君の買った車にはエンジンが付いてないので
買ってくるか、自分で作るか、好きにしてもらったらよいが
エンジン作る部分までは説明しないよ、ってことだな
0917デフォルトの名無しさん (ワッチョイ ff11-BPzU)
垢版 |
2017/09/06(水) 23:53:04.33ID:tZ2T0w/m0
>>915
CarはEngineに依存してるよ
インターフェース使えばEngineの実装には依存しないようにできるけど
インターフェースなので依存性がなくなったというのは認識として間違ってると思う

んで実装を注入する方法はいくつかあって、例えばコンストラクタ・インジェクションなら
Carインスタンスを生成するときにEngine実装のインスタンスを渡してあげるイメージ

public Car(Engine engine)
0925デフォルトの名無しさん (ワッチョイ b769-ZN1Y)
垢版 |
2017/09/07(木) 07:21:08.70ID:/528PZB30
>>924
実際、機能10個作って10年で内3つしか変更が入らないときって
残りの7つに費やした依存性解消の時間って無駄じゃね?
いつ精算できんの?

変更することになってからゆっくり金貰って変更すればいいよ
予めやっておく必要も金も時間も欠片もない
0927デフォルトの名無しさん (ワッチョイ 8343-3TYr)
垢版 |
2017/09/07(木) 07:33:51.36ID:j+BNBbb90
>>915 を書き直すとこういう感じだろうか
public class Car
{
 private Engine engine;
 public Car(Engine engine)
 {
  // engineのインスタンス生成は外部で行い、
  // その参照をEngineインターフェースの変数として保持する
  // (渡されたクラスにEngineインターフェースが実装されているか
  //  どうかしか感知しない)
  this.engine = engine;
 }
 public void go()
 {
   // コンストラクタで渡されたEngineを使うので、
  // インスタンスの実装には依存しない
  // (実際に渡されるクラスで変更があっても、
  //  それがEngineインターフェースに関わらない部分なら影響がない)
  engine.start();
 }
}

あと、↓に従ってくれると、他の人からも読みやすい

インターフェイスの名前付けのガイドライン
https://msdn.microsoft.com/ja-jp/library/cc433279(v=vs.71).aspx
"インターフェイス名には、この型がインターフェイスであることを示すために、プリフィックス I を付けます。"

メソッドの名前付けのガイドライン
https://msdn.microsoft.com/ja-jp/library/cc433282(v=vs.71).aspx
"Pascal 形式を使用します。"
0932デフォルトの名無しさん (ブーイモ MM26-nkYL)
垢版 |
2017/09/07(木) 08:02:41.36ID:j5w9yEfWM
下位のモジュールを結合した状態で単体テストするのはおかしなことではないでしょ
MSだって普通にクラスの中でnewしてるよ
見境なくDIすると結合したときとのギャップが大きくなりすぎる
○○サービスと呼べるような粒度の低いクラスだけにとどめるのがいいと思ってる
0935デフォルトの名無しさん (ワントンキン MM8a-SdQ8)
垢版 |
2017/09/07(木) 08:17:23.55ID:oeWMtJN8M
粒度も基準としてはあるが
自前のコードで完全に制御できないものはどこかで注入したほうがいいな
注入は別にインターフェースでなくてもいい
単にoverrideでもdelegateでも用途(今の文脈だとユニットテストか)に合えば良い
古い言語だとテスト用のモジュールをリンクしたり
マクロやインクルードで注入することもある
0936デフォルトの名無しさん (ブーイモ MM26-nkYL)
垢版 |
2017/09/07(木) 08:50:12.82ID:j5w9yEfWM
>>934
単体テストと結合テストの違いはテストケース
単体でも通るテストか、結合してないと通らないはずのテストか、それだけのこと
開発順序の都合とかネットワークに依存しててクソ遅いとか意図的に発生させるのが難しいエラーがあるといった特別な理由がない限り、
単体でも通るテストを結合して動かすことはなんら単体テストの意義を損なうものではないよ
0946デフォルトの名無しさん (アウアウエー Sa52-tij5)
垢版 |
2017/09/07(木) 12:58:50.81ID:vdmBVUrpa
質問者そっちのけで盛り上がってるねw

>>915が読んだ記事の著者のいう依存性の排除っていうのは恐らく、
Enineのコードが修正されてもCar側のコードがその影響を受けないようにする、
っていう程度の意味。(CarとEngineは別の人やチームが書いてると考えて)

そのための手段として、Carのコードでは具体的なクラスEngineではなく、
Car側のコードを書いている人、または第三者が定義したIインターフェイスEngineを使い、
EngineにはIEngineの実装を強制する。

そうすればEngineを書いている人はIEngineによって拘束され、
Car側(Engineを使う側)のコードが動かなくなるような変更はできなくなる。

まあたぶんこんな感じ。
だけど、下位の側のコード(この場合はEngine)を拘束するために
わざわざインターフェイスを使って抽象度を上げる(つまり可読性は下がる)必要が
本当にあるのかは、個人的にはかなり疑問。鶏を割くのに牛刀を使う感がある。

まあ質問者に確実に言えるのは、上にも書いたけど
依存性云々なんて理解しなくても問題ないから安心して読み飛ばしていいよってことw
0947デフォルトの名無しさん (ワッチョイ 0b11-zjjG)
垢版 |
2017/09/07(木) 13:03:19.68ID:NBIMX30y0
依存性をどっかで断ち切らないと、変更の影響が波及し過ぎるからだよ

その例で言うなら、Carの実装内容がEngineに直接依存してると
Engineを修正した時に、Carも修正しなくちゃならなくなるので、それを断ち切りたい訳だ

実際には、その2クラス間にしか依存関係が発生しないなら纏めて修正でもそこまで困らないんだけど
クラスAにクラスBが依存、クラスBにクラスCが依存、クラスCにクラスDが依存……って連鎖してく様な形になってると最悪で
クラスAを修正した結果、クラスB〜Dも全部修正とかになる可能性がある
レス数が900を超えています。1000を超えると表示できなくなるよ。

ニューススポーツなんでも実況