ソフトウェア工学

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

6
「関数とデータ間の密結合」が悪いのはなぜですか?
この引用は、「Clojureの喜び」のp。32、しかし誰かが先週の夕食で私に同じことを言って、私はそれを他の場所でも聞いた: [A]オブジェクト指向プログラミングの欠点は、関数とデータの間の密結合です。 アプリケーションで不要な結合が悪い理由を理解しています。また、オブジェクト指向プログラミングであっても、可変状態と継承を避けるべきだと言っています。しかし、なぜクラスに関数を貼り付けるのが本質的に悪いのかはわかりません。 つまり、クラスに関数を追加すると、Gmailでメールにタグを付けたり、ファイルをフォルダーに貼り付けたりするように思えます。それはあなたが再びそれを見つけるのを助ける組織的なテクニックです。いくつかの基準を選択してから、同じようなものをまとめます。OOP以前は、プログラムはファイル内のメソッドのかなり大きな袋でした。つまり、関数をどこかに配置する必要があります。整理してみませんか? これが型に対するベール攻撃である場合、関数への入力および出力の型を制限することは間違っていると言うだけではありませんか?それに同意できるかどうかはわかりませんが、少なくともプロとコンタイプの安全性に関する議論には精通しています。これは、ほとんど別の懸念のように思えます。 確かに、時々それを間違え、機能を間違ったクラスに置きます。しかし、他の間違いと比較すると、これは非常に小さな不便さのようです。 そのため、Clojureには名前空間があります。OOPのクラスに関数を貼り付けることは、Clojureの名前空間に関数を貼り付けることとどのように異なりますか?クラスの関数は、必ずしもそのクラスのメンバーだけで動作するとは限らないことを忘れないでください。java.lang.StringBuilderを見てください。これは、すべての参照型で動作するか、オートボクシングを通じて、すべての型で動作します。 PSこの引用は、私が読んだことのない本を参照しています:Multiparadigm Programming in Leda:Timothy Budd、1995。

8
スコープベースのメモリ管理の欠点
スコープベースのメモリ管理(SBMM)、またはRAIIは、C ++コミュニティでより一般的に(混乱して?)参照されるため、私は本当に気に入っています。私が知る限り、C ++(およびC)を除いて、SBMM / RAIIをメインメモリ管理メカニズムとする他の主流の言語は現在使用されておらず、代わりにガベージコレクション(GC)を使用しています。 これはかなりわかりにくい SBMMはプログラムをより決定的にします(オブジェクトがいつ破壊されるかを正確に知ることができます)。 GCを使用する言語では、多くの場合、手動でリソース管理を行う必要があります(たとえば、Javaでファイルを閉じるを参照)。これは、GCの目的を部分的に無効にし、エラーも発生しやすくなります。 ヒープメモリは(非常にエレガントに、imo)スコープにバインドすることもできます(std::shared_ptrC ++を参照)。 SBMMがより広く使用されないのはなぜですか?その短所は何ですか?

11
ベストプラクティスに従わないオープンソースプロジェクトでコーディングスタイルを変更しても大丈夫ですか?
最近、GitHubで多くのオープンソースRuby(またはその大部分がRuby)プロジェクトに遭遇しました。Rubocopなどのコード分析ツールで確認すると、多くの違反が発生します。 現在、これらの違反のほとんどには、単一引用符の代わりに二重引用符を使用することが含まれています(補間ではない場合)、レベルごとに2スペースの規則に従っていない、80文字の行長規則を超えている、または複数行のブロックを使用{し}ています。 [The] Rubyスタイルガイドでは、実際のRubyプログラマーが他の実際のRubyプログラマーが保守できるコードを作成できるように、ベストプラクティスを推奨しています。〜ソース:Rubyスタイルガイド 小さくて簡単に修正できますが、オフェンスを修正してプルリクエストを行うことで、オープンソースプロジェクトのコーディングスタイルを変更することは適切ですか?私はRailsのようないくつかのプロジェクトは、ことを認め化粧品の変更を受け入れないと、一部がRubocopが実行されたとき(Railsが例えば80,000犯罪を生成し、一度にすべての「修正」にあまりにも大きいです-に関係なく、彼らは独自の小さなセット持ってコーディングを貢献する際に従うべき規則)。結局のところ、Rubocopのようなツールと一緒にRubyスタイルガイドがあります。 人々は一貫性を高く評価しているので、このような変更を加えることは、Rubyコミュニティ全体にとって良いことです。 [Rubyスタイルガイドの著者]は、どこからともなくすべてのルールを思いついたわけではありません。それらは、主にプロのソフトウェアエンジニアとしての幅広いキャリア、Rubyコミュニティのメンバーやさまざまなメンバーからのフィードバックや提案に基づいています「Programming Ruby 1.9」や「The Ruby Programming Language」など、高く評価されているRubyプログラミングリソース。〜ソース:Rubyスタイルガイド コミュニティコーディングスタイルの規則とベストプラクティスに従っていないため、基本的に悪いプラクティスを奨励していませんか?

3
「main」がintまたはvoidではなくdoubleまたはStringを返すことができないのはなぜですか?
例えばC、C ++、およびJavaなどの多くの言語では、main方法/機能は、の戻り型有しvoidまたはintではなく、doubleまたはString。その背後にある理由は何ですか? main実行時ライブラリによって呼び出されint main()、int main(int,char**)そのようないくつかの構文を想定しているため、それを実行できないことを少し知っています。 だから私の質問は次のとおりです。なぜそれがmain持っているタイプ署名を持っており、別のものではないのですか?


6
HTMLで厳密な解析が選択されなかったのはなぜですか?
HTMLの作成時に厳密な解析が選択されなかった理由をよく考えました。インターネットの歴史のほとんどにおいて、ブラウザはあらゆる種類のマークアップを受け入れ、それを解析するために最善を尽くしています。このプロセスはパフォーマンスを低下させ、人々が意味不明なものを書くことを許可し、時代遅れの機能を中止することを困難にします。 HTMLが厳密に解析されない特定の理由はありますか?
38 html  history  parsing 

8
プロジェクトで開発者を交代させるのは良い考えですか、悪い考えですか?
私は小さなチームで働いており、別の小さなチームと一緒に大規模な新しいプロジェクトに取り組み始めます。他のチームは現在、長年取り組んでいるレガシーシステムで作業しています。 マネージャーは、私のチームの開発者が、レガシーシステムで作業している開発者を置き換えるために、数か月ごとに交代することを決定しました。そうすれば、他のチームは新しいプロジェクトに取り組み、新しいシステムをよりよく理解できるようになります。 2〜3か月ごとにプロジェクトから開発者を交代することの利点と欠点(ある場合)を知りたい。 これは「主任開発者を交代させるのは良い考えなのか悪い考えなのか」と似た質問であることを知っています。、しかしその質問は主任開発者に焦点を当てています。この質問は、プロジェクト全体でチーム全体をローテーションすることに関するものです(新しいプロジェクトの技術リーダーはローテーションされる場合とされない場合があります。まだわかりません)。

7
卒業生/ジュニアエンジニアにはどのような基準が期待できますか?[閉まっている]
卒業生の開発者からのバッファオーバーフローは許容されますか?バーの設定が高すぎませんか?卒業生/ジュニアエンジニアの期待される能力は何ですか? コンテキスト: 現在、主にLinuxのCで働いているジュニア開発者の募集をしています。 プロセスの一環として、候補者はCで自由にコードテストを完了する必要があります。 これまでのところ、コードは読みやすく、場合によってはかなり慣用的ではあるが、無制限のバッファ書き込みによるバッファオーバーフローエラーに悩まされていたため、2つの候補を拒否しました。 [編集]: エラーチェック済みの製品品質コードを明示的に要求します。 候補者にテストとビルドのフレームワークを提供します [更新]: このスレッドと、他の開発者と直接話し合った結果、コードテストの実施方法と採用対象者を変更しています。 候補者がバッファオーバーフローを修正または理解できないということは、私たちが実施する作業に不適当であり、特に、私たちが納得できる以上の指導を必要とすることを意味すると判断しました。したがって、最終的に堅牢なコードサンプルを送信できない候補は引き続き拒否します。 ただし、採用プロセスを私たちと候補者の両方にとってより生産的にするためのいくつかの手段を導入しました。 特に: 生産品質が意味するものを明確に説明し、入力とエラーに対してコードが堅牢であると予想されるという警告で、期待をより明確にします。 コードテストの説明では、候補を防御プログラミングのリソースとC標準ライブラリにリンクしています。 ターゲットオーディエンスをジュニア開発者および卒業生から変更し、ある程度関連する経験を持つ人々をターゲットにしました。 提出されたコードが何らかの方法で失敗するが、そうでなければ受け入れられる場合、エラー条件を引き起こす最小限のテストケースを提供し、候補者に間違いを修正する機会を与えます(他の理由でコードが拒否されない限り)。必要に応じて、問題のある行/関数も指摘します。 テスト自体の目標は、フロントエンドフィルターから、候補者のより良い状況を構築する機会にわずかに変更されました。特に、電話での議論に役立ちます。とはいえ、私たちはコードのみに基づいて拒否するつもりです。 [2015-07-09更新]: NujobのAndy Davisが、候補者の観点からのコードテストの使用に関する興味深い関連記事を書きました。この記事は一見の価値があります。ここで見つけてください。

4
ログイン試行の失敗をログに記録するとパスワードが公開されます
次のようなメッセージで、失敗したログイン試行をWebサイトに記録し始めました Failed login attempt by qntmfred これらのログの一部が次のように見えることに気づきました Failed login attempt by qntmfredmypassword ユーザー名フィールドにユーザー名とパスワードを入力したためにログインに失敗した人もいると思います。パスワードはデータベース内でハッシュ化されますが、何らかの理由でdbが危険にさらされた場合、これらのログメッセージは、攻撃者がこのようなログインに失敗する少数の人々のパスワードを把握する方法になる可能性があります。 これを処理するより良い方法はありますか?この可能性についても心配する必要がありますか?

7
CLIアプリの開発は「後方」と見なされますか?[閉まっている]
私はプログラミングの経験が豊富なDBAです。 私はいくつかのCLI、非日常的なアプリを開発しました。これらのアプリは、日々の反復タスクを解決したり、それほど複雑ではないものの、より複雑なタスクから人的エラーを排除したりします。これらのツールは現在、ツールボックスの一部です。 CLIアプリは、自動化されたワークフローに含めることができるので素晴らしいと思います。 また、単一のことを行うがそれをうまく行い、プロセスの出力を別の入力とするというUnixの哲学は、戦略的な利点に統合するよりもツールのセットを構築する優れた方法です。 私の上司は最近、CLIツールの開発は「後方」である、または「回帰」を構成するとコメントしました。 現在存在するほとんどのCLIツールはレガシーではなく、常に改善されたバージョンがリリースされているライブプロジェクトであるため、私は同意しませんでした。 この種の開発は、市場で「後方」と見なされますか? 履歴書では見た目が悪いですか? また、ウェブであろうとデスクトップであろうと、すべてのソリューションを検討しました。コマンドライン、非対話型オプションが必要です。一部の人々は、これをプログラミングリソースの無駄だと考えています。 この目標は、ソフトウェアプロジェクトの価値ある目標ですか? また、Webアプリまたはデスクトップアプリの場合、代替CLIインターフェイスを持つことは、ビジネスロジックがGUIから完全に切り離されていることを示す素晴らしい方法だと思います。
38 skills  cli 

4
C ++では、仮想関数はなぜそしてどのように遅いのですか?
誰でも詳細に、仮想テーブルが正確にどのように機能するか、仮想関数が呼び出されたときにどのポインターが関連付けられるかを詳細に説明できますか。 実際に遅い場合、仮想関数の実行にかかる時間が通常のクラスメソッドよりも長いことを示すことができますか?いくつかのコードを見なくても、どのように/何が起こっているのかを簡単に見失うことがあります。

5
C#がcaseブロックにローカルスコープを持たないのはなぜですか?
私はこのコードを書いていました: private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x => x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } そして、コンパイルエラーを見つけて驚いた: 「action」という名前のローカル変数がこのスコープで既に定義されています 解決するのは非常に簡単な問題でした。2番目の要素を取り除くだけでvarうまくいきました。 明らかに宣言された変数caseのブロックは親のスコープを持っているswitchが、私はこれが理由として興味があります。C#は、実行が(それは他のケースを落下することはできませんことを考える必要があり …

6
私が唯一の開発者である場合、自分のリポジトリでプルリクエストを使用する目的はありますか?
だから私はGitHubで私の本当のプロジェクトを始めました。物事はかなり順調に進んでおり、アイデアは当初思っていたよりもずっと速く流れていました。物事を整理するために、いくつかのブランチをセットアップして、異なる機能を個別に開発できるようにします。 私はGitHubのに私の枝を押すと今、私は私は2つのボタンがあり、そのセクションがありますPull Requestし、Compare私は最近にプッシュブランチの名前を持ちます。Compareボタンの目的は理解していますが、自分のリポジトリでプルリクエストを作成する理由がわかりません。 誰かが私がそうする理由を説明できますか?自分が唯一の開発者である場合、自分のリポジトリでプルリクエストを行うことは有用ですか?
38 github  workflows 

10
Today()が不純な関数の例なのはなぜですか?
「純粋関数」に関するこのウィキペディアの記事のようなものを読むToday()と、不純関数の例としてリストされているように見えますが、私にはかなり純粋に見えます。正式な入力引数がないためですか?実際の時刻が「関数への入力」として扱われないのはなぜですか。その場合、同じ入力を与えた場合、つまりtoday()同時に2回実行した場合、または時間をさかのぼって再度実行した場合(仮定: ))、出力は同じ時間になります。Today()あなたに乱数を与えることはありません。常に時刻が表示されます。 ウィキペディアの記事には「異なる時間で異なる結果が得られる」と書かれていますが、それは異なるx sin(x)ことを言うと異なる比率が得られるようなものです。そしてsin(x)、純粋な関数の例です。

9
プログラミングにおけるメモリ管理は無関係な関心事になっていますか?
背景 私は、昔から行ったことのない古い(しかし素晴らしい)サイトであるAlioth Language Shootout(http://benchmarksgame.alioth.debian.org/)を再訪しました。 私は数年前にC / C ++でプログラミングを開始しましたが、それ以来、関与しているプロジェクトの言語の制約のため、ほぼJavaのみで作業を続けてきました。リソース使用量の点でC / C ++に反しました。 実行時間は最悪で、JavaはC / C ++よりも4倍も遅いを実行すると、まだ比較的良好であったが、平均の周りの(または以下)2倍に。Java自体の実装の性質により、これは驚くことではなく、パフォーマンス時間は実際に私が予想したものよりも短かったです。 実際のレンガはメモリ割り当てでした-最悪の場合、Javaが割り当てられました: Cの52倍ものメモリ C ++の25倍以上。 メモリの52倍...絶対に厄介ですよね?... またはそれは?現在、メモリは比較的安価です。 質問: 作業メモリに厳しい制限があるターゲットプラットフォーム(つまり、組み込みシステムなど)に関して話さない場合、今日汎用言語を選択する際にメモリ使用量を考慮する必要がありますか? 第一言語としてScalaへの移行を検討しているからです。私はそれの機能面が非常に好きですが、私が見ることができることから、それはJavaよりもメモリの点でさらに高価です。ただし、メモリは年々速く、安く、豊富になっているようです(少なくとも4GBのDDR3 RAMを持たない消費者のラップトップを見つけることはますます困難になっているようです)。より読みやすいソリューションを迅速に構築できる(おそらく実装上高価な)高レベル言語機能と比較して無関係ですか?

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