ソフトウェア工学

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

6
Lispには、他のプログラミング言語で採用されていない特別な機能がまだありますか?
Lispには、他のプログラミング言語で採用されていない特別な機能がまだありますか? Lispとは、すべてのLispプログラミング言語全体を意味します。私はLispがどれほど素晴らしいかを聞いてきましたが、多くの言語がLispに触発されたことを知っています。しかし、Lispには、他の言語では実行できない排他的なデザイン機能がまだありますか? 私が質問した理由は、最近、私自身アマチュアプログラマーである私はただ楽しみのためにClojureを学び始めたので、その結果、私はLisp関連の投稿やコメントをたくさん見つけたということです。しかし、他の最新のプログラミング言語は、条件、再帰、ファーストクラスの市民としての機能など、すでにLispから多くのアイデアを採用し盗んでいます。さらに、多くの言語でメタプログラミングを行うこともできます。 私は何かを見逃し、「Lispはまだ違う」のですか? あるいは、他の現代言語がLispからすべての優れた部分を盗んだため、括弧Lispの世界を掘り下げる必要がなく、「Lispは違っていた」ので、私は幸運です。

6
開発者がWindowsでインストールを自動化しないのはなぜですか?[閉まっている]
これは、「開発者がLinuxでインストールウィザードを作成しないのはなぜですか?」の逆ですが、興味深いことですが、「自動インストールは自然な方法です。なぜウィザードを使用するのですか?」 したがって、逆の質問があります: 怠などの問題ではないと確信していますが、開発者は、主に消費者向けのアプリであっても、まったく煩わされない完全な自動インストールを行わない理由を理解できません。通常、同じアプリがLinuxに自動インストールされるので、WindowsとMac OSはどうでしょうか? この傾向には技術的な理由がありますか、それとも単なる慣習ですか?
35 windows 

7
頻繁な合併の競合は問題の兆候ですか?
チームでは、ソース管理としてGitを使用しています。ほとんど独立しているが重複するコード領域がいくつかあります。最近、ソース管理を使用するためのワークフローとアプローチについて議論してきました。機能ブランチワークフローの使用を促進するときに出てくる不満の1つは、人々がしばしば複雑なマージ競合に遭遇し、それが誤って解決されることです。複雑なことで、私は「解決方法については明らかではない」という意味です。これを踏まえて、「プルリベース」ベースのワークフローなど、他のワークフローがより積極的に使用されています。 機能分岐アプローチの支持者として、私は実際に苦情を受け取っていません。はい、ローカルの機能ブランチをマスターまたはどこからでも最新の状態に維持する必要がありますが、それが唯一の本当の問題です。マージが常に複雑で、二次的な影響がある場合、それはGitの問題ではなく、チームワークの問題であると考えています。 これを考えるのは正しいですか?複雑なマージの競合は、良いものか悪いものかの兆候ですか?

5
別のクラスのClassCollectionを作成することをお勧めしますか?
Carクラスがあると言いましょう: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } 駐車場に関するシステムを作成しているとしましょう。私は多くのCarクラスを使用するので、クラスを作成しCarCollectionますFindCarByModel。 public class CarCollection { public List<Car> Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …

6
子の親への参照を初期化する最良の方法は何ですか?
私は多くの異なる親/子クラスを持つオブジェクトモデルを開発しています。各子オブジェクトには、その親オブジェクトへの参照があります。親参照を初期化するいくつかの方法を考えることができます(そして試してみました)が、各アプローチには重大な欠点があります。以下で説明するアプローチのうち、どれが最良であるか、またはそれよりも優れている場合を考えます。 以下のコードがコンパイルされることを確認しませんので、コードが構文的に正しくない場合は、私の意図を確認してください。 常に表示するわけではありませんが、一部の子クラスコンストラクターは(親以外の)パラメーターを取ることに注意してください。 呼び出し元は、親を設定し、同じ親に追加する責任があります。 class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); public List<Child> Children { get {return _children;} } } 欠点:親の設定は、消費者にとって2段階のプロセスです。 var child = new …

2
MVCS-モデルビューコントローラーストア
私は最近、iOS開発の学習を開始することを決めました。そのために、iOSプログラミング:The Big Nerd Ranch Guideを読みました。本の中で著者はMVCS-Model-View-Controller-Storeのデザインパターンについて説明しています。基本的な考え方は、多くのアプリケーションがデータの複数の外部ソースを利用するため、コントローラーのリクエストロジックを維持するのが非常に面倒になる可能性があるということです。すべての要求ロジックをコントローラーから別のオブジェクトに移動することを提案します。 要するに本を引用する Model-View-Controller-Storeは要求ロジックを別のオブジェクトに入れ、このオブジェクトをストアと呼びます(図28.4)。ストアオブジェクトを使用すると、冗長なコードが最小限に抑えられ、データをフェッチして保存するコードが簡素化されます。最も重要なことは、外部ソースを処理するためのロジックを、明確で焦点の合った目標を持つ整然としたクラスに移動することです。これにより、コードが理解しやすくなり、保守とデバッグが容易になり、チームの他のプログラマーと共有できます。 そして 非同期ストアの優れた点は、多くのオブジェクトが要求を処理するために多くの作業を行っているにもかかわらず、要求とその応答のフローがコントローラーの1か所にあることです。これにより、読みやすく変更しやすいコードの利点が得られます。 私はこのパターンについてもっと知り、他の人がそれについて何を言わなければならないかを見たいと思っていましたが、オンラインで検索している間、私が見つけることができる唯一の参照はその同じ本に関するものでした(パターンはおそらく他の名前で知られていますか?)。 私にとって著者の論理は理にかなっているようで、通常のMVCパターンの論理的な拡張のように思えますが、おそらく実際にはMVCパターンの経験があまりないためです(iOS開発への進出を除いて)ソートで使用MVVのBACKBONE.JS(、であるあなたがそれMVC検討している場合))。 おそらく、より多くの経験を積んだ人が、MVCSパターンに明らかな欠陥や問題がないかどうかを明らかにすることを望んでいました。

6
Gitフレンドリーなスプレッドシート形式ですか?[閉まっている]
私たちは、プロジェクトのドキュメント作成プロセスをGoogleドキュメントから自己ホスト型のGitリポジトリのセットに移行しようとしています。 テキストドキュメントはGitに十分対応しています。通常、高度な書式設定は必要ないので、複雑な場合にLaTeXを埋め込むオプションを使用して、すべてをたとえばマルチマークダウンに変換します。 しかし、スプレッドシートはまったく別の話です...バージョン管理システムにやさしい(そして、できれば、Markdownと同じくらい人間が読める)spreadsheed(-like)形式はありますか? 「フレンドリーなフォーマット」:Gitはフォーマットでうまく機能し(XML では機能しません)、人間が読めるdiffを生成します(外部ツールを含む追加の設定はOKです)。 明らかに、Markdownフレーバーを使用すると静的テーブルを作成できますが、次のようなものを使用できるようにしたいと思いSUM()ます...(CSVにも同じ問題があることに注意してください。)いいね 更新:Linux向けの回答のみ、お願いします。MS Officeのものはありません。

9
実動サーバーでの開発
今日、私は本番サーバーでアプリケーションを開発することで怒鳴られました。「実稼働サーバーでの開発は受け入れられません-これまでに!」 これが状況です。 開発インスタンスをセットアップしました。 http://example.com:3000 実稼働インスタンスは次のとおりです。 http://example.com すべての開発作業を完了し、http://example.com:3000クライアントが変更に満足したら、それらをに移動しますhttp://example.com。 私が使用しているアプリケーションは古いRuby on Railsアプリケーションです。最初は開発環境をローカルに設定しようとしましたが、実行することはできませんでした。しばらく試した後、私はあきらめ、本番サーバーで開発することにしました。 繰り返しますが、私はばかですか?おそらくそうですが、私はここ数年、Web開発を行ってきましたが、このような状況に遭遇したことはありません。誰が正しいのか?

9
アルゴリズムはプログラミング言語よりも重要ですか?
現在(2013年)のGoogle Code Jamコンテストでは、40行のコードのみを使用して同じ問題を解決したPythonの人々と比較して、C ++およびJavaの人々が200行以上のコードを必要とする問題がありました。 PythonはC ++やJavaと直接比較することはできませんが、冗長性の違いはおそらくアルゴリズムの効率に影響を与えると考えられます。 言語の選択と比較して、適切なアルゴリズムを知ることはどれほど重要ですか?優れた実装のPythonプログラムを(同じアルゴリズムを使用して)より良い方法でC ++またはJavaで実装でき、これは特定のプログラミング言語の自然な冗長性と関係がありますか?
35 java  c++  algorithms  python 

10
開発者は、単体テスト以外のテストを担当する必要がありますか?
現在、かなり大きなプロジェクトに取り組んでおり、JUnitとEasyMockを使用して、かなり広範囲のユニットテスト機能を使用しています。私は今、私が心配すべき他のタイプのテストに興味を持っています。開発者として、機能テストや回帰テストなどについて心配するのは私の責任ですか?これらをMaven / Ant / Gradleなどのツールで使用可能な方法で統合する良い方法はありますか?これらはテスターまたはBAに適していますか?私が見逃している他の有用なタイプのテストはありますか?
35 testing 

12
コードの作成方法の段階的なシフトは、システムのパフォーマンスに影響しましたか?そして、私は気にする必要がありますか?
TD; DR: 私が尋ねていたものに関していくつかの混乱があったので、ここに質問の背後にある運転のアイデアがあります: 私はいつもそれが何であるかという質問を意図していました。当初はうまく表現できなかったかもしれません。しかし、意図は常に「モジュール式、分離、疎結合、分離、リファクタリングされたコード」であり、「モノリシックな単一ユニット、1か所ですべてを行う、1つのファイル、密結合された」コードよりも、それ自体の性質が著しく遅い。残りは単なる詳細であり、その際に私が出会った、または現在または将来出会うであろうさまざまな症状です。ある程度の規模では確かに遅いです。最適化されていないディスクのように、どこからでも断片を拾わなければなりません。遅いです。確かに。しかし、私は気にする必要がありますか? そして問題は…ではない マイクロ最適化、時期尚早な最適化などに関するものではありません。「これまたはその部分を最適化して死ぬ」ことではありません。 それは何ですか? それは、時間の経過とともに現れたコードの記述についての全体的な方法論と手法、および考え方に関するものです。 「このコードを依存関係としてクラスに挿入する」 「クラスごとに1つのファイルを書き込む」 「データベース、コントローラー、ドメインからビューを分離する」。 スパゲッティの均質な単一のコードブロックを書くのではなく、一緒に動作する多くの個別のモジュールコンポーネントを書く 現在-この10年以内に-ほとんどのフレームワークで見られ、主張され、規約で主張され、コミュニティを介して伝えられているコードの方法とスタイルについてです。「モノリシックブロック」から「マイクロサービス」への考え方の転換です。それに伴い、マシンレベルのパフォーマンスとオーバーヘッド、さらにプログラマレベルのオーバーヘッドの面で価格が発生します。 元の質問は次のとおりです。 コンピュータサイエンスの分野では、プログラミングに関しては思考の著しい変化に気付きました。私はこのようなアドバイスを頻繁に目にします。 より小さな関数ごとのコードを記述します(この方法によりテストと保守が容易になります) ほとんどのメソッド/関数の長さが数行になり、目的が明確になるまで、既存のコードをますます小さなコードチャンクにリファクタリングします(より大きなモノリシックブロックと比較して、より多くの関数を作成します) 1つのことだけを行う関数を書く-関心の分離など(通常、スタック上により多くの関数とフレームを作成します) より多くのファイルを作成します(ファイルごとに1つのクラス、MVC、ドメインアーキテクチャ、デザインパターン、オブジェクト指向などのレイヤーの目的のために、より多くのファイルシステム呼び出しを作成するために、分解の目的でより多くのクラス) これは、2500行にまたがるメソッドと、すべてを行う大きなクラスと神オブジェクトを持つ「古い」または「時代遅れの」または「スパゲッティ」コーディングプラクティスと比較した変更です。 私の質問はこれです: 呼び出しがマシンコード、1と0、アセンブリ命令、HDDプラッターに至るとき、リファクタリングされたさまざまな小から小の関数とメソッドを備えた完全にクラス分離されたOOコードも生成されることを心配する必要がありますか余分なオーバーヘッドですか? 詳細 OOコードとそのメソッド呼び出しが最終的にASMでどのように処理されるか、またDB呼び出しとコンパイラー呼び出しがHDDプラッター上のアクチュエータアームの移動にどのように変換されるかについてはよく知りませんが、いくつかの考えがあります。追加の関数呼び出し、オブジェクト呼び出し、または(#include)呼び出し(一部の言語)は、追加の命令セットを生成するため、実際の「有用な」コードを追加することなく、コードの量を増やし、さまざまな「コードワイヤリング」オーバーヘッドを追加すると想定しています。また、ASMが実際にハードウェアで実行される前に、ASMに対して適切な最適化を実行できることも想像しますが、その最適化を実行できるのはそれだけです。 したがって、私の質問-十分に分離されたコード(何百ものファイル、クラス、デザインパターンなどに分割されるコード)が(スペースと速度で)どのくらいのオーバーヘッドをもたらすかは、「このオーバーヘッドのために、すべてを1つのモノリシックファイルに」 明確にするために更新: 同じコードを取得して分割し、リファクタリングし、より多くの関数とオブジェクト、メソッド、クラスに分離することで、より小さなコード間でより多くのパラメーターが渡されると想定しています。確かに、リファクタリングコードはスレッドを継続する必要があり、そのためにはパラメーターを渡す必要があります。より多くのメソッドまたはより多くのクラスまたはより多くのファクトリメソッドのデザインパターンは、単一のモノリシッククラスまたはメソッドの場合よりも、さまざまな情報を渡すオーバーヘッドを増やします。 どこか(TBDを引用)では、すべてのコードの最大70%がASMのMOV命令で構成され、実際の計算ではなくCPUレジスタに適切な変数をロードすると言われていました。私の場合、PUSH / POP命令を使用してCPUの時間を増やし、さまざまなコード間でリンケージとパラメーターの受け渡しを行います。コードを小さくするほど、より多くのオーバーヘッド「リンケージ」が必要になります。このリンケージがソフトウェアの肥大化とスローダウンに追加することを懸念しており、これを心配する必要があるのか​​、もしあれば、どれくらいの量を心配する必要があるのか​​、次の世紀のソフトウェアを構築しているプログラマーの現在と将来の世代、これらのプラクティスを使用して構築されたソフトウェアと共存し、使用する必要があります。 更新:複数のファイル 古いコードを徐々に置き換えている新しいコードを書いています。特に、古いクラスの1つが〜3000行のファイルであったことに注意しました(前述のとおり)。今では、テストファイルを含むさまざまなディレクトリに配置された15〜20のファイルのセットになりつつあり、いくつかのものを結合するために使用しているPHPフレームワークは含まれません。さらに多くのファイルが来ています。ディスクI / Oに関しては、複数のファイルのロードは、1つの大きなファイルのロードよりも遅くなります。もちろん、すべてのファイルがロードされるわけではなく、必要に応じてロードされ、ディスクキャッシングとメモリキャッシングのオプションが存在しますが、それでもメモリloading multiple filesよりも多くの処理が必要になると思いloading a single fileます。それを懸念に加えています。 更新:依存性のすべてを注入 しばらくしてこれに戻って..私の質問は誤解されたと思います。または、いくつかの答えを誤解することを選んだかもしれません。いくつかの答えが出てきたので、マイクロ最適化については話していません(少なくとも、マイクロ最適化について話していることは間違った呼び方だと思います)。 、コードのあらゆるレベルで。私は最近、このスタイルのコードがコンベンションの中心的なポイントの1つであり、Zend Conから来ました。ビューからロジック、モデルからビュー、データベースからモデルを分離し、可能であればデータベースからデータを分離します。依存関係-すべてを挿入します。これは、何もしない配線コード(関数、クラス、ボイラープレート)を追加することを意味する場合があります、ただし、シーム/フックポイントとして機能し、ほとんどの場合、コードサイズを簡単に2倍にします。 更新2:「コードをより多くのファイルに分割する」ことは、パフォーマンスに大きな影響を与えますか(コンピューティングのすべてのレベルで) compartmentalize your code into multiple files今日のコンピューティング(パフォーマンス、ディスク使用率、メモリ管理、CPU処理タスク)の哲学はどのように影響しますか? …


2
Unicodeライセンス
Unicode 利用規約では、データファイル(またはそれらの変更)を使用するソフトウェアにはUnicodeライセンスリファレンスを含める必要があると記載されています。ほとんどのUnicodeライブラリには、文字が数字、文字、記号などであるかどうかを確認する機能があるため、Unicodeデータファイルの変更(通常は表形式)が含まれているようです。それは、ライセンスが適用され、そのようなUnicodeライブラリを使用するすべてのアプリケーションがライセンスを保持する必要があることを意味しますか? 確認したところ、ライセンスを保持しているユニコードプログラムはほとんどないようですが、ライセンスを保持していないもののほとんどはユニコードコンソーシアムのメンバーである企業のものです(ライセンスの免除は受けられますか?)。 一部(Mozillaなど)は「リエゾンメンバー」にすぎず、ソフトウェアはライセンスを保有していませんが(私の知る限り)、それらのデータファイルから派生したデータに依存しています。Mozillaはライセンスに違反していますか? あらゆる形式の高度なUnicodeサポートを含む(つまり、Unicodeデータファイルに依存する必要がある)すべてのアプリでライセンスを保持する必要がありますか?または、何らかの形で広範な免除がありますか(ライセンスを保有するプログラムは非常に少ないため)。 この質問をUnicodeスタッフに転送しました。返信がある場合は、ここに投稿します。

4
C ++ 11に切り替える方法は?
私はしばらくの間C ++でプログラミングを行ってきましたが、ほとんどはC ++の低レベルの機能に集中していました。それによって、私は主にポインターと生の配列で作業することを意味します。この動作は、クラスでCとしてC ++を使用することで知られていると思います。それにもかかわらず、私は最近初めてCを試しました。C#やJavaなどの言語が、ディクショナリやリストなどの便利な標準ライブラリクラスでこれらの詳細を隠していることに驚きました。 C ++標準ライブラリにはベクター、マップ、文字列などの多くのコンテナがあり、C ++ 11はstd ::配列と範囲ループを使用することでこれに追加するだけであることを認識しています。 これらの最新の言語機能をどのように活用し、どの場面がどの瞬間に適しているかを最もよく学ぶにはどうすればよいですか?最近のC ++でのソフトウェアエンジニアリングは、ほとんど手動のメモリ管理から解放されているのですか? 最後に、新しい標準を最大限に活用するためにどのコンパイラを使用する必要がありますか?Visual Studioには優れたデバッグツールがありますが、VS2012でさえひどいC ++ 11サポートがあるようです。
35 c++  c++11 


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