ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

6
iOSで大きくて不器用なUITableViewControllerを避ける方法は?
iOSでMVCパターンを実装するときに問題があります。インターネットを検索しましたが、この問題の良い解決策を見つけられないようです。 多くのUITableViewController実装はかなり大きいようです。私が見てきた例のほとんどは、することができますUITableViewController実装<UITableViewDelegate>と<UITableViewDataSource>。これらの実装は、大きくなっている大きな理由UITableViewControllerです。一つの解決策は、その実装別々のクラスを作成することです<UITableViewDelegate>と<UITableViewDataSource>。もちろん、これらのクラスにはを参照する必要がありUITableViewControllerます。このソリューションを使用する上で欠点はありますか?一般に、デリゲートパターンを使用して、他の「ヘルパー」クラスなどに機能を委任する必要があると思います。この問題を解決する確立された方法はありますか? モデルに含まれる機能やビューが多すぎないようにします。これはMVCパターンの基礎の1つであるため、ロジックは実際にはコントローラークラスにあるべきだと思います。しかし、大きな問題は次のとおりです。 MVC実装のコントローラーを、どのように小さな管理可能な部分に分割する必要がありますか?(この場合、iOSのMVCに適用) これを解決するための一般的なパターンがあるかもしれませんが、iOSのソリューションを具体的に探しています。この問題を解決するための良いパターンの例を教えてください。ソリューションが優れている理由を説明してください。

4
JVMがテールコールの最適化に課す制限
Clojureは、単独で末尾呼び出しの最適化を実行しません。末尾再帰関数があり、それを最適化する場合は、特別な形式を使用する必要がありますrecur。同様に、相互に再帰的な関数が2つある場合、を使用してのみ最適化できますtrampoline。 Scalaコンパイラは、再帰関数に対してTCOを実行できますが、2つの相互再帰関数に対してはできません。 これらの制限について読んだときはいつでも、JVMモデルに固有の制限に常に起因していました。コンパイラについてはほとんど何も知りませんが、これは少し困惑します。から例を見てみましょうProgramming Scala。ここで機能 def approximate(guess: Double): Double = if (isGoodEnough(guess)) guess else approximate(improve(guess)) に翻訳されています 0: aload_0 1: astore_3 2: aload_0 3: dload_1 4: invokevirtual #24; //Method isGoodEnough:(D)Z 7: ifeq 10: dload_1 11: dreturn 12: aload_0 13: dload_1 14: invokevirtual #27; //Method improve:(D)D 17: dstore_1 18: goto 2 そのため、バイトコードレベルでは、が必要gotoです。この場合、実際には、ハードワークはコンパイラーによって行われます。 基礎となる仮想マシンのどの機能により、コンパイラはTCOをより簡単に処理できますか? …
36 scala  clojure  jvm  tail-call 

6
どのようにヤッツィーのゲームをTDDすべきですか?
YahtzeeゲームのTDDスタイルを書いているとしましょう。5つのサイコロのセットがフルハウスかどうかを判断するコードの一部をテストします。私の知る限り、TDDを行うときは、次の原則に従います。 最初にテストを書く 可能な限り簡単なことを書く リファインとリファクタリング したがって、最初のテストは次のようになります。 public void Returns_true_when_roll_is_full_house() { FullHouseTester sut = new FullHouseTester(); var actual = sut.IsFullHouse(1, 1, 1, 2, 2); Assert.IsTrue(actual); } 「可能な限り最も簡単なものを書く」に従っている場合、次のようにIsFullHouseメソッドを記述する必要があります。 public bool IsFullHouse(int roll1, int roll2, int roll3, int roll4, int roll5) { if (roll1 == 1 && roll2 == 1 && roll3 == 1 …
36 unit-testing  tdd 

10
私は初心者です。C ++ 11の学習を直接開始できますか?または私は古いC ++を学ぶ必要がありますか?[閉まっている]
私は初心者であり、プログラミングの知識はほとんどありません。 新しいC ++ 11を扱っている本からC ++を直接学んだり、古い最高のC ++の本を勉強したりするのは良いことでしょうか? C ++ 11を学習する前に、C ++についての知識がほとんどないはずですか?またはそこから直接開始できますか? C ++ 11から直接起動すると問題が発生しますか?いいえの場合は、C ++ 11に関する本をいくつか提案してください。
36 c++  c++11 

4
IRCチャンネルで質問するときのエチケット[終了]
多くの大規模なOSSプロジェクトでは、IRCチャネルを維持して、その使用法や開発について議論しています。Webで情報を見つけようとして失敗したため、プロジェクトの使用にこだわったとき、何をすべきかを判断する方法の1つは、IRCチャンネルにアクセスして質問することです。 しかし、私の質問は、チャンネルの人々によって常に完全に無視されます。入室時に沈黙があったとしても、沈黙は続きます。進行中の会話がある場合、それは動揺しません。チャンネルを数時間開いたままにして、誰かが最終的に私に関与することを期待していますが、何も起こりません。 だから、どういうわけか私が理解できない失礼な態度をとったり、暗黙のルールを破って無視されたりするのではないかと心配しています。私は質問を丁寧に、要点まで、文法的にし、明白な解決策を試みたのか、なぜうまくいかなかったのかを示しようとします。私は明らかにチャンネルの人々にとって完全に見知らぬ人であることを理解していますが、これを修正する方法がわかりません。何も言わずに、1週間だけチャンネルに潜む必要がありますか?それもばかげているようです。 私が送信する典型的なメッセージは、「こんにちは-Fooを動作させようとしましたが、BarExceptionを取得し続けています。Quuxをリセットしようとしましたが、これは何もしません。私が何を試すことができるかについての提案?」

7
マルチスレッドおよびマルチプロセッサプログラミングの非推奨のプラクティスはありますか?
FORTRANとBASICの初期には、本質的にすべてのプログラムはGOTOステートメントで記述されていました。結果はスパゲッティコードであり、ソリューションは構造化プログラミングでした。 同様に、ポインターはプログラムの特性を制御するのが難しい場合があります。C ++は多くのポインターで開始しましたが、参照の使用をお勧めします。STLのようなライブラリは、依存関係の一部を軽減できます。より優れた特性を持つスマートポインターを作成するイディオムもあり、C ++の一部のバージョンでは参照とマネージコードを許可しています。 継承やポリモーフィズムなどのプログラミング手法では、舞台裏で多くのポインターを使用します(ただし、構造化プログラミングでは分岐命令で満たされたコードを生成します)。Javaのような言語は、プログラマーに依存せずにポインターを削除し、ガベージコレクションを使用して動的に割り当てられたデータを管理します。 私の読書では、セマフォを使用していないように見えるマルチプロセスおよびマルチスレッドのプログラミングの例を見てきました。異なる名前で同じものを使用していますか、それとも同時使用からリソースの保護を構築する新しい方法がありますか? たとえば、マルチコアプロセッサを使用したマルチスレッドプログラミングシステムの具体例は、OpenMPです。環境に含まれていないように見えるセマフォを使用せずに、次のように重要な領域を表します。 th_id = omp_get_thread_num(); #pragma omp critical { cout << "Hello World from thread " << th_id << '\n'; } この例は、http://en.wikipedia.org/wiki/OpenMPからの抜粋です。 あるいは、関数wait()およびsignal()を使用したセマフォを使用したスレッドの相互の保護は、次のようになります。 wait(sem); th_id = get_thread_num(); cout << "Hello World from thread " << th_id << '\n'; signal(sem); この例では、物事は非常に単純であり、wait()およびsignal()呼び出しが一致していることを示すには簡単なレビューで十分であり、多くの並行性がある場合でもスレッドセーフが提供されます。しかし、他のアルゴリズムはより複雑で、複数のセマフォ(バイナリとカウントの両方)を使用し、多くのスレッドが呼び出すことができる複雑な条件を持つ複数の関数に分散しています。デッドロックを作成したり、物事をスレッドセーフにできなかったりすることの結果は、管理が難しい場合があります。 OpenMPのようなこれらのシステムはセマフォの問題を排除しますか? 彼らは問題を他のどこかに移動させますか? セマフォを使用しないようにアルゴリズムを使用してお気に入りのセマフォを変換するにはどうすればよいですか?

2
Haskell委員会がI / Oを表すモナドを選んだのはなぜですか?
クリーン言語が使用一意の種類を純粋に機能的な設定でI / Oを処理します。Haskell委員会がなぜモナドを使用したのですか?委員会が調査したが、反対した決定した状態を処理するための他の提案がありましたか? 注:私は、モナドと他の形式のコンピューティングとの間の聖戦を探していません。I / Oに関する委員会の選択だけにトピックを保ちましょう。

7
なぜこれほど多くの言語が値渡しされるのですか?
Cのような明示的なポインター操作がある言語でさえ、常に値で渡されます(参照で渡すことができますが、これはデフォルトの動作ではありません)。 これの利点は何ですか、なぜ多くの言語が値で渡されるのか、なぜ他の言語は参照で渡されるのですか?(私は確信していませんが、Haskellが参照渡しであることを理解しています)。

9
プログラマーはテスターが悪いですか?
これはすでに質問されている他の質問とよく似ていますが、実際は少し異なります。一般に、プログラマーはアプリケーションのテストの役割を実行するのが得意ではないと考えられているようです。例えば: Joel on Software- テスターがいない上位5つの(間違った)理由(強調) 大学のCS卒業生に、彼らがあなたのために働くことができると告げようとすることさえ考えないでください。私はこれを見てきました。プログラマーは優れたテスターを作りません。そして、交換するのがはるかに難しい優れたプログラマーを失います。 そして、この質問では、最も人気のある答えの1つが言います(再び、私の強調): 開発者はテスターに​​なることができますが、テスターであってはなりません。開発者は、アプリケーションを破壊する可能性のある方法での使用を意図せず/意識せずに避ける傾向があります。それは、彼らがそれを書いて、大抵それが使われるべき方法でそれをテストするからです。 質問は、プログラマーがテストに苦手なのか?この結論を裏付ける証拠や議論はありますか?プログラマは自分のコードをテストするのが苦手なだけですか?プログラマーが実際にテストに長けていることを示唆する証拠はありますか? 「テスト」とはどういう意味ですか?私は、単体テストや、ソフトウェアを作成するためにソフトウェアチームが使用する方法論の一部と見なされるものを意味しません。コードが構築され、ソフトウェアチームが「テスト環境」と呼ぶものにデプロイされた後に使用される何らかの品質保証方法を意味します。
36 testing  qa 

8
OOPは簡単になりますか、難しくなりますか?[閉まっている]
オブジェクト指向プログラミングの概念が何年も前にプログラマーに紹介されたとき、それは興味深く見え、プログラミングはよりきれいになりました。OOPはこんな感じでした Stock stock = new Stock(); stock.addItem(item); stock.removeItem(item); わかりやすい名前を付けるとわかりやすくなりました。 しかし、データ転送オブジェクト、値オブジェクト、リポジトリ、依存性注入などのパターンを持つOOPは、より複雑になりました。上記を実現するには、いくつかのクラス(例:抽象、ファクトリ、DAOなど)を作成し、いくつかのインターフェイスを実装する必要があります。 注:コラボレーション、テスト、統合を容易にするベストプラクティスに反対するわけではありません

9
バージョン管理と個人設定ファイル
このプロジェクトでは、ユーザー固有の構成ファイルを使用します。このファイルは、ユーザーごとに異なるため、現在バージョン管理されていません。問題は、開発者が構成を必要とする新しいモジュールを追加するか、既存のモジュールの名前を変更すると、プライベート構成ファイルが更新されないため、他の開発者にエラーが発生することです。 この問題を解決するために、2つの構成ファイルで作業することを考えました。バージョン管理になり、新しいモジュールを追加する各開発者によって定期的に更新されるデフォルト/グローバル構成ファイルと、除外されるプライベート構成ファイルバージョン管理され、ユーザー固有の変更のみが含まれます。 ただし、これは依然としてアドホックなソリューションのようです。 より良い解決策を提案できますか? 専門家は何をしますか?

2
RESTを実行する適切な方法は何ですか?
誰もが実際に何が何であるかを実際に理解していない場合でも、誰もがSOAを実行しています。だから彼らは間違っています。それを類推として使用して、RESTが何であるか(または少なくとも私はそう思う)を知っており、その一部を実行したいと考えています。しかし、私はそれを正しくしたい。 だから私の質問は、RESTを行う適切な方法は何ですか?

3
ソフトウェア製品をリリースしました-予算がなく限られた時間の中で露出を最大限にするにはどうすればよいですか?
これに関してコミュニティに手を差し伸べたいと思います。ソフトウェア開発者として、私は販売の専門家でもマーケティングの第一人者でもありません。私が出くわすほとんどの開発者はこのようなものであり、真面目なペニーピンチャーでもある傾向があります。開発者として、最近、新しいソフトウェア製品をリリースしたとしましょう。人々がそれを知っていればヒットすることは間違いありません。$ 0.00の予算と毎日の限られた時間(30〜60分)を想定します。これらの制限内で、露出を最大化するにはどうすればよいですか? 可能であれば、少なくとも2つの実例を使用して返信をバックアップしてください。
36 marketing 

10
これらの悪い開発者の兆候はありますか?[閉まっている]
以前は、ビジネスモデルが変化することを認識せずに、クライアントからの仕様の変更を非難し、適応可能な方法で開発することが私の仕事です。私は今、それを悪い開発者の兆候として見ています(変更しました!)。 しかし今、私は自分の中に他の「泣き言」を見る。最近、「丸い穴に四角い釘を嵌めようとするようなものだ」と言っていることに気付きました。また、プロジェクトが進行していないことに対するクライアントの優柔不断を非難しています。 態度を変えるべき場所に注意すべき兆候はありますか?クライアントは常に正しいですか、それともイライラすることを正当化できますか?

15
独学でコーディングの練習を続けるべきですか、それともプロとしてコーディングする方法を学ぶべきですか?[閉まっている]
最近、私はプロの仕事を得て、他のプログラマーと付き合い、業界で友達を作りました。唯一のことは、私は100%独学です。それは、私のスタイルが適切に訓練されたスタイルから大きく逸脱する原因になりました。異なるのは、私のコードのテクニックと構成です。 それは私がするいくつかのことの混合物です。私はいくつかのプログラミングパラダイムをブレンドする傾向があります。機能的およびオブジェクト指向のように。私はオブジェクト指向よりも機能的な側面に傾いていますが、抽象的なエンティティとして何かがより理にかなっている場合にオブジェクト指向の使用を見ます。ゲームオブジェクトのような。次に、私は何かをするときも簡単なルートに行きます。対照的に、プロのプログラマーから見たコードは、そのために複雑な場合があるようです!私は多くのクロージャーを使用しています。そして最後に、私は最高のコメント者ではありません。コメントを読むよりコードを読むだけの方が簡単だと思います。そしてほとんどの場合、コメントがあったとしてもコードを読んでしまいます。加えて、コードを簡単に書くことができるため、非常に読みやすいと言われました。 専門的な訓練を受けたプログラマーが単体テストのようなことを続けていると聞きます。私が今まで使用したことがないものなので、それらが何であるか、またはどのように機能するかについての微妙な考えすらありません。たくさんのアンダースコア「_」は、本当に私の好みではありません。私が使用する技術のほとんどは、私から直接のもの、または私が読んだ数冊の本です。MVCについては何も知りません。backbone.jsのようなものについてはよく耳にします。アプリケーションを整理する方法だと思います。ただ私を混乱させているのは、今では自分の組織構造を作ったからです。 それは少し苦痛です。UbuntuのQuicklyのような新しいことを学ぶときは、テンプレートアプリケーションをまったく使用できません。訓練を受けた人からだとわかるコードを理解するのに苦労しています。完全なオブジェクト指向プログラミングは本当に私の口に悪い味を残しますが、それは他の誰もが厳密に使用しているもののようです。 自分のコードの見栄えに自信がなかったり、入社時に火花を散らしたり、オープンソースプロジェクトに貢献したりするのではないかと思いました。実際、私は人々が最終的に私のコードをチェックアウトするという事実をかなり恐れています。これはプログラマーが経験する普通のことなのでしょうか、それとも本当に自分のテクニックを変えるべきなのでしょうか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.