ソフトウェア工学

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


9
ほとんどの「よく知られた」命令型/オブジェクト指向言語が、「何もない」値を表すことができる型への未チェックのアクセスを許可するのはなぜですか?
null(たとえば)の代わりに持つことの(不)利便性について読んでいMaybeます。この記事を読んだ後、私はそれを使用する方がはるかに良いと確信していますMaybe(または同様のもの)。しかし、すべての「よく知られた」命令型またはオブジェクト指向プログラミング言語がまだ使用しておりnull(「何もしない」値を表すことができる型への未チェックのアクセスを許可します)、そしてMaybeほとんどが関数型プログラミング言語で使用されていることに驚いています。 例として、次のC#コードを見てください。 void doSomething(string username) { // Check that username is not null // Do something } ここで何か悪臭がします...引数がnullかどうかを確認する必要があるのはなぜですか?すべての変数にオブジェクトへの参照が含まれると仮定すべきではありませんか?ご覧のとおり、問題は、定義上、ほとんどすべての変数にnull参照が含まれている可能性があることです。どの変数が「null可能」で、どれがそうでないかを判断できたらどうでしょうか。これにより、デバッグと「NullReferenceException」の検索中に多くの労力を節約できます。デフォルトでは、null参照を含むことができる型はないことを想像してください。その代わりに、本当に必要な場合にのみ、変数にnull参照を含めることができると明示的に述べます。それが多分背後にある考え方です。場合によっては失敗する関数(ゼロ除算など)がある場合は、Maybe<int>、結果がintである可能性があることを明示的に示しますが、何もありません!これは、nullではなくMaybeを好む理由の1つです。他の例に興味がある場合は、この記事を読むことをお勧めします。 事実は、ほとんどの型をデフォルトでNULL可能にするという欠点にもかかわらず、ほとんどのオブジェクト指向プログラミング言語は実際にそれをNULL可能にします。それが私が疑問に思う理由です: nullプログラミング言語ではなく、どのような引数を実装する必要がありMaybeますか?理由はありますか、それとも単に「歴史的な荷物」ですか? この質問に答える前に、nullとMaybeの違いを理解してください。

5
Linuxソースコードのパッケージ化の標準はいつ.tar.gzになりましたか?
主にLinuxシステム用に開発されたオープンソースプロジェクトを閲覧し、最新のパッケージをダウンロードする場合、ソースコードは常に.tar.gzまたは.tar.bz2ファイルに保存されます。 .zipや.rarなどの圧縮アルゴリズムではなく.tar.gzや.tar.bz2を使用する(またはプロジェクトが十分に小さい場合は非圧縮のままにする)理由はありますか?

7
「データ隠蔽」と「カプセル化」の違いは何ですか?
「実際のJava同時実行性」を読んでいます。「幸いなことに、カプセル化やデータ隠蔽など、よく組織化された保守可能なクラスを作成するのに役立つオブジェクト指向の手法は、スレッドセーフの作成にも役立ちますクラス。" 問題#1-データの隠蔽について聞いたことがなく、それが何であるかわかりません。 問題#2-カプセル化はプライベート対パブリックを使用しており、実際にはデータが隠れていると常に考えていました。 データ隠蔽とは何か、カプセル化とどのように異なるのか説明していただけますか?

8
コードとデータの分離はどのようにして実践になりましたか?
質問を注意深く読んでください:理由ではなく、方法を尋ねます。 私は最近、データベースを使用して不変データを保存することを提案するこの答えに出会いました: あなたが説明するマジックナンバーの多くは、特にそれらが部品に依存している場合は、コードではなく実際にデータであるように聞こえます。[...] SQLタイプのデータベースを意味する場合もあれば、単にフォーマットされたテキストファイルを意味する場合もあります。 あなたのプログラムが行うことの一部であるデータがある場合、やるべきことはプログラムにそれを置くことだと私には思えます。たとえば、プログラムの機能が母音をカウントすることvowels = "aeiou"である場合、その中にあることの何が問題になっていますか?結局のところ、ほとんどの言語には、まさにこの使用のために設計されたデータ構造があります。上記のように、「フォーマットされたテキストファイル」にデータを配置することで、データを分離するのはなぜですか?選択したプログラミング言語でフォーマットされたテキストファイルを作成しないのはなぜですか?これはデータベースですか?それともコードですか? これは馬鹿げた質問だと思う人もいるかもしれませんが、真剣に質問します。「変数に誤解を招く名前を付けないでください」や「あなたの言語が取るに足らない」。 たとえば、次の記事をご覧ください:データをPuppetコードから分離する際の問題。問題?何の問題?Puppetがインフラストラクチャを記述するための言語である場合、ネームサーバーが8.8.8.8であることも記述できないのはなぜですか?問題はコードとデータが混在しているということではないように私には思える1が、人形は十分に豊富なデータ構造や他のものにインタフェースする方法を欠いていること。 このシフトが邪魔だと思います。オブジェクト指向プログラミングでは、「任意にリッチなデータ構造が必要」と言われたため、コードの力をデータ構造に付与しました。その結果、カプセル化と抽象化が行われます。SQLデータベースにもストアドプロシージャがあります。コードから腫瘍を取り除くかのように、データをYAMLまたはテキストファイルまたはダムデータベースに隔離すると、そのすべてが失われます。 コードからデータを分離するこのプラクティスがどのようになったのか、そしてそれがどこに向かっているのか、誰でも説明できますか?誰もが著名人による出版物を引用したり、「データからコードを分離する」ことを新たな戒めとして示し、その起源を示す関連データを提供できますか? 1:そのような区別さえすることができれば。Lispプログラマーを探しています。

5
Java / C#でRAIIを実装できないのはなぜですか?
質問:Java / C#でRAIIを実装できないのはなぜですか? 明確化:ガベージコレクターは決定論的ではないことを認識しています。そのため、現在の言語機能では、オブジェクトのDispose()メソッドをスコープの終了時に自動的に呼び出すことはできません。しかし、そのような決定論的な機能を追加できますか? 私の理解: RAIIの実装は、次の2つの要件を満たす必要があると感じてい ます。1.リソースの有効期間はスコープにバインドされている必要があります。 2.暗黙的。リソースの解放は、プログラマーによる明示的なステートメントなしで行われる必要があります。明示的なステートメントなしでメモリを解放するガベージコレクターに似ています。「暗黙性」は、クラスの使用ポイントでのみ発生する必要があります。もちろん、クラスライブラリの作成者は、デストラクタまたはDispose()メソッドを明示的に実装する必要があります。 Java / C#はポイント1を満たします。C#では、IDisposableを実装するリソースを「using」スコープにバインドできます。 void test() { using(Resource r = new Resource()) { r.foo(); }//resource released on scope exit } これはポイント2を満たしません。プログラマは、オブジェクトを特別な「使用」スコープに明示的に結び付けなければなりません。プログラマーは、リソースをスコープに明示的に結び付けることを忘れる可能性があり(実際にそうします)、リークを作成します。 実際、「使用中」ブロックは、コンパイラーによってtry-finally-dispose()コードに変換されます。try-finally-dispose()パターンと同じ明示的な性質を持っています。暗黙のリリースがなければ、スコープへのフックは構文糖衣です。 void test() { //Programmer forgot (or was not aware of the need) to explicitly //bind Resource to a scope. Resource r …

6
特定の機能を関数に抽出する必要がありますか?
3つのタスクを実行する大きなメソッドがあり、それぞれを個別の関数に抽出できます。そのタスクごとに追加の関数を作成する場合、コードが良くなるか悪くなるか、そしてその理由は何ですか? 明らかに、メイン関数のコード行は少なくなりますが、追加の関数宣言があるので、クラスには追加のメソッドがありますが、クラスがより複雑になるため、これは良くないと思います。 すべてのコードを書く前にそれを行うべきですか、それともすべてが完了するまでそのままにしてから関数を抽出する必要がありますか?

3
Schema.orgとマイクロフォーマット
どちらも同じ目的を果たします。セマンティックマークアップの語彙を提供します。スキーマは認識され標準化されていますが、マイクロフォーマット標準はオープンコミュニティプロセスによるものです。 スキーマはドキュメント内のmicrodataを活用しますが、microformatsはクラスで使用されます。(注:microdataは、要素が単一itemtypeでなければならないことを意味しますが、microformatsでは複数のクラスを同じ要素に適用できます。xFolk+ hAtomをクラスでマークアップできますが、microdataではできません。) これは白黒の状況ですか?Googleは、「パーサーを混乱させる可能性があるため」両方を使用できないと言います。 これらのコンセンサスは何ですか?

4
金メッキを停止し、作業開発をリリースするだけで満足する方法[終了]
私が所属する開発チームは、最近アジャイルのプラクティスに従って作業するようになりました。これは、コード(およびドキュメント)のゴールドメッキを止めることができないという事実を個人的に強調しており、その結果、要件をはるかに早く満たすソリューションを提供できたときに、当初の見積もりを上回りました。 私は自分の倫理が強迫観念に接していると思います。私はコードに執着しすぎて、リファクタリングしてn度完成させる前にリリースすることはめったにありません。これに気づいたことを嬉しく思いますが、どのように自分の態度/精神を変えて自分の進歩に満足し、代わりに時間通りにリリースできますか?

4
バグを修正するときは、常にユニットテストを行うべきですか?
バグを修正する場合、最初に特定のバグで失敗するテストを記述し、次にテストが合格するまでコードを修正することをお勧めします。これはTDDのプラクティスに従っており、良いプラクティスであると想定されていますが、実装に非常に近い不可解なテストを作成する傾向があることに気付きました。 たとえば、ジョブが送信され、特定の状態に到達し、中止され、再試行されたときに問題が発生しました。このバグを再現するために、スレッド同期、多くのモックなどを含む大規模なテストが作成されました...それは仕事をしましたが、コードをリファクタリングしているので、このマンモスを削除するだけで非常に魅力的です新しいデザインに合わせるには、本当に多くの作業が(再び)必要になります。そして、1つの特定のケースで1つの小さな機能をテストするだけです。 したがって、私の質問:再現が難しいバグをどのようにテストしますか?実装をテストし、リファクタリングと可読性を損なうものを作成しないようにするにはどうすればよいですか?
29 testing  tdd 

9
Pure Java Webブラウザー、実用的ですか?[閉まっている]
Java Webブラウザが可能であることは知っていますが、実用的ですか?Loboプロジェクトを見て、感銘を受けたことを認めなければなりませんが、私が収集したことから、2009年に開発が停止したようです。 ChromeやFirefoxのランクに含まれるものですか、それとも本質的に速度が遅く、ユーザーを妨げますか?
29 java  web  browser 

1
文書データベースとリレーショナルデータベースとグラフデータベースのどちらを使用すべきですか?[閉まっている]
議論のために、FourSquareのシナリオを考えてみましょう。 シナリオ エンティティ: ユーザー 場所 関係: チェックイン:ユーザー<->場所、多対多 友人:ユーザー<->ユーザー、多対多 データベース設計 これらにはエラーが発生する可能性が高いため、指摘してください。 RDBMS テーブル: ユーザー 場所 チェックイン(ジャンクション) 友達(ジャンクション) 長所: CAP:一貫性、可用性 短所: CAP:パーティション許容値、別名シャーディング スキーム=柔軟性のない構造 貧弱な複製? グラフ オブジェクト: ユーザー 場所 エッジ: 友達:ユーザー<->ユーザー チェックイン:ユーザー->場所 タイムスタンプを含む 長所: CAP:一貫性、可用性? スキーマレスで簡単に変更可能なオブジェクトとエッジ グラフトラバーサルクエリ、たとえば: クラスタリング 友達のグループを見つける 似たような人が好きなレストランを見つける 他の一般的な/有用なクエリはありますか? 短所: CAP:パーティションの許容範囲? ドキュメント/オブジェクト 3つの個別のデータベース? ユーザー 友達リスト チェックイン タイムスタンプ ユーザー 場所 場所 長所: …

6
ビジネスクラスにはどの言語で名前を付ける必要がありますか?
この質問でベストプラクティスを要求しています。これは、顧客会社が英語以外の母国語を厳密に持っている場合にのみ問題になると思います。 顧客が主に非常にドメイン固有の(たとえば、ドイツ語)表現を多く持っており、ドメイン固有ではないいくつかの名前が混在している場合。コードコメントの言語、クラス/メソッド/変数名は英語です。すべてのドメイン固有の名前を翻訳しますか?
29 naming 

11
あなたの最高のプログラマーは、他の全員のコードをソース管理にチェックインする必要がありますか?
svnとgitの違いの 1つは、リポジトリへのアクセスを制御する機能です。変更をコミットすることを誰に許可するべきかについての観点の違いがあるため、2つを比較するのは困難です! この質問は、どこかの会社のチームの中央リポジトリとしてgitを使用することに関するものです。チームのメンバーのスキルレベルはさまざまであり、ほとんどの企業と同じであると想定しています。 Gitは、あなたの最高の(最も生産的で、最も経験豊富な)プログラマーだけがコードのチェックインを信頼していると想定しているようです。その場合は、実際にコードを書くのに時間を割いて、他の人のコードを確認してチェックインすることになります。これで成果はありますか?この質問は、一般的なバージョン管理のベストプラクティスではなく、最高のプログラマーの時間を最大限に活用することに焦点を当てたいと思います。当然の結果として、自分の仕事の大部分が他の人のコードをレビューすることである場合、優秀なプログラマーは辞めますか?両方の質問が要約されると思います:レビューは生産性に見合う価値があるのでしょうか?

3
モナドを見るさまざまな方法
Haskellの学習中に、モナドとは何か、Haskellでモナドが重要である理由を説明しようとする多くのチュートリアルに直面しました。それぞれが類推を使用していたので、意味をつかみやすくなります。結局のところ、私はモナドが何であるかの3つの異なるビューになりました: 表示1:ラベルとしてのMonad 時々、モナドは特定のタイプのラベルとして考えます。たとえば、次のタイプの関数: myfunction :: IO Int myfunctionは、実行されるたびにInt値を生成する関数です。結果の型はIntではなくIO Intです。そのため、IOは、Int値がIOアクションが行われたプロセスの結果であることをユーザーに警告するInt値のラベルです。 その結果、このInt値はIOを持つプロセスからの値としてマークされているため、この値は「ダーティ」です。あなたのプロセスはもはや純粋ではありません。 見解2:モナドは、厄介なことが起こりうるプライベートな空間として。 すべてのプロセスが純粋で厳格なシステムでは、副作用が必要になる場合があります。そのため、モナドは、厄介な副作用を実行するための小さなスペースです。この空間では、あなたは純粋な世界から脱出し、不純なものに行き、あなたのプロセスを作り、価値を持って戻ってくることができます。 表示3:カテゴリー理論のようなモナド これは私が完全に理解していない見解です。モナドは、同じカテゴリーまたはサブカテゴリーの単なるファンクターです。たとえば、Int値があり、サブカテゴリとしてIO Intがあります。これは、IOプロセスの後に生成されるInt値です。 これらのビューは正しいですか?どちらがより正確ですか?

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