ソフトウェア工学

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

2
C文字列リテラルが読み取り専用なのはなぜですか?
文字列リテラルが読み取り専用であることの利点は、以下を正当化(-ies / -ied)します: 足で自分を撃つ別の方法 char *foo = "bar"; foo[0] = 'd'; /* SEGFAULT */ 1行で単語の読み書き配列をエレガントに初期化できない: char *foo[] = { "bar", "baz", "running out of traditional placeholder names" }; foo[1][2] = 'n'; /* SEGFAULT */ 言語自体を複雑にします。 char *foo = "bar"; char var[] = "baz"; some_func(foo); /* VERY DANGEROUS! */ some_func(var); /* …
29 c  memory  strings 

3
UMLがほとんどのフリーソフトウェア(Linuxなど)で使用されないのはなぜですか?
UMLがほとんどのフリーソフトウェアプロジェクトで使用されていない理由を理解しようとしています。たとえば、私のDebian / Linuxシステムにはおそらく1万を超えるフリーソフトウェアパッケージがあり、明示的な UMLフレームワークと方法論を使用して開発されたものであっても名前を付けることはできません。例えば、Qtの、GCC、Linuxのカーネル、bashの、GNUのメイク、OCamlで、Gnomeの、ユニゾン、lighttpdの、libonion、ドッキングウィンドウは、すべてのUMLを言及していない(私の知る限り)のフリーソフトウェアプロジェクトです。 (私の推測では、UMLは開発タスクの正式な下請けに非常に適していると思いますが、それはフリーソフトウェアの開発方法ではありません) UMLに関する資料を読みましたが、それについて十分に理解しているとは主張していません。 実際、UMLが使用されているフリーソフトウェアに簡単に名前を付けることはできません(おそらく、フリーソフトウェアとして実装された一部のUMLツールを除く)。おそらくopenstackは例外です(UMLに言及しているものがあります)。 (古いフリーソフトウェアプロジェクトでさえ、開始後にUMLを採用したかもしれませんが、採用していませんでした) Papyrusに取り組んでいる一部の同僚は、ほとんどのフリーソフトウェアプロジェクトは、明確な(そして十分に深い)形式化されたモデルを最初から持っていないと述べました。また、UMLはJavaが主張するよりもはるかに関連しているように見えます(Ocaml、Common Lisp、Haskell、Javascript、さらにはC ++ 11でも意味がないかどうかはわかりません)。おそらく、アジャイルなソフトウェア開発はあまりUMLフレンドリーではありません。 何らかの形で関連する質問に対するこの回答も参照してください。M.ファウラーのブログはデザインが死んでいますか?洞察力があります。 PS。主に意見の問題だとは思わない。いくつかの客観的な理由と、フリーソフトウェアの本質的な特性があるはずです。UMLは、正式な下請けにのみ有用であり、独自のプロジェクトのように、開発されたソフトウェアの一部が隠されている場合にのみ有用であると推測する傾向があります。もしそうなら、UMLはフリーソフトウェア開発と互換性がありません。 NB:私は自分でUMLファンではありません。私はUMLを紙の文書としてのみ定義するのではなく、ソフトウェアツールの [メタ]データ形式としても定義します

4
C#6.0の新しいnull条件演算子は、Demeterの法則に反しますか?
デメテルの法則は次のように述べています: 各ユニットは、他のユニットに関する限られた知識のみを持つ必要があります。現在のユニットに「密接に」関連するユニットのみです。 各ユニットは、その友人とのみ会話する必要があります。見知らぬ人と話をしないでください。 身近な友達とだけ話してください。 C#6.0では、null-conditional operatorと呼ばれる新しい演算子が導入されました。私見、それはコーディングを容易にし、読みやすさを向上させます。ただし、クラスフィールドをナビゲートするのが簡単で、すでにヌル(のようなものvar x = A?.B?.C?.D?.E?.F?)をチェックしているため、より結合されたコードを簡単に記述できます。 この新しいオペレーターがデメテルの法則に反すると述べるのは正しいですか?

1
すぐに呼び出される匿名JavaScript関数の用語は何ですか?
私は、チームのためにJavaScriptスタイルガイドを作成しています。これにより、ドキュメントをより簡単に整理して投稿できます。しかし、私は私の質問が適用される場所である小さなバンプを打った... すぐに呼び出される匿名JavaScript関数を何と呼ぶべきでしょうか。単純に「匿名関数」と呼ぶことはできますが、すぐに呼び出されるという事実を強調したいと思います。 以下に例を示します。 var MyVariable = (function(data){ return "another value" })("some value"); console.log(MyVariable); // "another value"

8
コードをクラスや関数にラップする代わりに、長くて簡単なコードをコピーして貼り付けることは受け入れられますか?
インターネットに接続し、そのような接続結果を表示するコードのセグメントがあるとします: HttpRequest* httpRequest=new HttpRequest(); httpRequest->setUrl("(some domain .com)"); httpRequest->setRequestType(HttpRequest::Type::POST); httpRequest->setRequestData("(something like name=?&age=30&...)"); httpRequest->setResponseCallback([=](HttpClient* client, HttpResponse* response){ string responseString=response->getResponseDataString(); if(response->getErrorCode()!=200){ if(response->getErrorCode()==404){ Alert* alert=new Alert(); alert->setFontSize(30); alert->setFontColor(255,255,255); alert->setPosition(Screen.MIDDLE); alert->show("Connection Error","Not Found"); }else if((some other different cases)){ (some other alert) }else Alert* alert=new Alert(); alert->setFontSize(30); alert->setPosition(Screen.MIDDLE); alert->setFontColor(255,255,255); alert->show("Connection Error","unknown error"); } }else{ (other handle …

3
書き換えのバージョン管理の実践
製品(プロトタイプ)P_OLDを言語Xで開発し、現在は言語YでP_NEWとして最初から書き直しています。 P_NEWとP_OLDは同じ製品であるため: P_NEWは古いP_OLDのブランチである必要がありますか、それとも独自のリポジトリである必要がありますか? バージョン管理の観点からこのような大きな変更を処理する通常の方法は何ですか?

10
ポインター変数の使用はメモリのオーバーヘッドではありませんか?
CやC ++などの言語では、変数へのポインターを使用しているときに、そのアドレスを格納するためにもう1つのメモリの場所が必要です。これはメモリのオーバーヘッドではありませんか?これはどのように補償されますか?ポインターは、タイムクリティカルな低メモリアプリケーションで使用されていますか?
29 c++  c  pointers 

2
プログラムの64ビットバージョンを作成するのが難しいのはなぜですか?
私の短時間のプログラミングでは、プログラムの完全なソースがある限り、32ビットまたは64ビットのマシンでC ++、Javaなどをコンパイルするのは簡単でした。 しかし、多くのソフトウェアは64ビットでリリースされていません。最も厄介なことに、Unityエンジンの64ビットリリースはまだありません。 64ビットマシン用に一部のプログラムをコンパイルするのが難しいのはなぜですか?

8
現実の世界で「強力な」型システムを使用しているのは、たとえば大規模なWebアプリの場合ですか?
これは非常に広く、曖昧で、おそらく哲学的な質問であることを知っています。質問の中で最も重要なキーワードである「強力な」タイプのシステム自体は、ある程度不明確です。だから、私が意味することを説明しようとさせてください。 質問の全体的なコンテキスト 私たちはRuby on Railsで非常に大規模なWebアプリを構築してきましたが、私たちは一般的にスタックに満足しています。必要に応じて、ものを非常に高速に出荷できます-約10%のエッジケースをあまり心配することなく、「ビジネス」ケースの90%で機能するものです。一方、コードレビューとテストカバレッジの助けを借りて、ゆっくりと慎重になり、すべてのベースをカバーするようにすることができます-再び、そのような綿密な調査と安全に値する状況でのみ。 しかし、チームが成長するにつれて、スタックに焼き付けられた「セーフティネット」の欠如に不快感を覚え始めました。 最近、JavaでAndroidのネイティブ開発を開始しました。そして、私はコンパイルされた/静的な/強く型付けされた言語によって提供される安全性を(心地よく)思い出しました。 変数のつづりが間違っている、データ型が間違っている、関数の呼び出しが正しくない、些細なエラーがIDE自体でキャッチされます。IDEがコンパイラにフックして、プログラムの「正確性」の特定の側面を検証できるためです。 関数シグネチャを変更する必要がありますか?簡単です。コンパイラ+ IDEは、すべての呼び出しサイトを見つけるのに役立ちます。 特定の例外が常に処理されるようにする必要がありますか?あなたの救助のチェックされた例外。 現在、これらの安全機能には利点がありますが、それらの欠点もよく知っています。さらに、「ボイラープレートヘビー」Javaの世界では。したがって、Javaの代わりに、私は人々が最近作業を開始した多数の現代の「強く型付けされた」言語を見始めました。例:Scala、Rust、Haskellなど。私が最も興味を持っているのは、型システムと静的/コンパイル時チェックの力です。 さて、質問 これらの強力な型システムと静的/コンパイル時機能を大規模なアプリケーションで使用するにはどうすればよいですか? たとえば、これらの強力な機能の標準的な「hello world」のような紹介を超えてどのように移行するのでしょうか リッチタイプシステムを使用してビジネスドメインの問題をモデル化するものはありますか?タイプシステムは、30,000 LOC +ゾーンにいるときに役立ちますか、それとも妨げになりますか?システムが弱く型付けされた外の世界と対話するとき、これらの型システムによって提供されるセーフティネット(およびコンパイル時チェック)に何が起こるか。JSONまたはXML API、さまざまなデータストア、ユーザー入力などを介して

6
新しいオブジェクトを作成するか、すべてのプロパティをリセットしますか?
public class MyClass { public object Prop1 { get; set; } public object Prop2 { get; set; } public object Prop3 { get; set; } } のオブジェクトmyObjectがMyClassあり、そのプロパティをリセットする必要があるとします。新しいオブジェクトを作成するか、各プロパティを再割り当てする方が良いでしょうか?古いインスタンスで追加の使用法がないと仮定します。 myObject = new MyClass(); または myObject.Prop1 = null; myObject.Prop2 = null; myObject.Prop3 = null;

6
classキーワードなしで「オブジェクト指向」プログラミングを実装できますか?
銀行の「口座」の抽象化を提供したいとします。functionPythonでオブジェクトを使用する1つのアプローチを次に示します。 def account(): """Return a dispatch dictionary representing a bank account. >>> a = account() >>> a['deposit'](100) 100 >>> a['withdraw'](90) 10 >>> a['withdraw'](90) 'Insufficient funds' >>> a['balance'] 10 """ def withdraw(amount): if amount > dispatch['balance']: return 'Insufficient funds' dispatch['balance'] -= amount return dispatch['balance'] def deposit(amount): dispatch['balance'] += amount return dispatch['balance'] …

3
適切な汎用型システム
Javaジェネリックがいくつかの重要な方法で失敗したことは一般に受け入れられています。ワイルドカードと境界の組み合わせにより、いくつかの深刻な読み取り不能コードが発生しました。 しかし、他の言語を見ると、プログラマが満足している一般的な型システムを見つけることができないようです。 このような型システムの設計目標として次を採用する場合: 常に読みやすい型宣言を生成します 簡単に習得できます(共分散、反分散などをブラッシュアップする必要はありません) コンパイル時エラーの数を最大化します それを正しくした言語はありますか?私がグーグルで見た場合、私が見る唯一のことは、型システムが言語Xをどのように吸うかについての苦情です。この種の複雑さはジェネリック型に固有のものですか?コンパイル時に型安全性を100%検証しようとするのをあきらめるだけですか? 私の主な質問は、これらの3つの目標に関して最も「うまくいく」言語です。私はそれが主観的であることを認識していますが、これまでのところ、すべてのプログラマーが汎用型システムが混乱していることに同意するわけではない言語を見つけることさえできません。 補遺:前述のように、サブタイピング/継承とジェネリックの組み合わせが複雑さを引き起こすので、両方を組み合わせ、複雑さの爆発を回避する言語を本当に探しています。

6
型推論のトレードオフは何ですか?
すべての新しいプログラミング言語、または少なくとも一般的になったプログラミング言語は型推論を使用しているようです。Javascriptでさえ、さまざまな実装(Acscript、typescriptなど)を通じて型と型推論を取得しました。私には良さそうに見えますが、トレードオフがあるのか​​、Javaや古い良い言語に型推論がないのはなぜだと思いますか 型を指定せずにGoで変数を宣言すると(型なしのvarまたは:=構文を使用)、変数の型は右側の値から推測されます。 Dを使用すると、動的言語のように、型を重複して指定せずに大きなコードフラグメントを作成できます。一方、静的推論は型と他のコードプロパティを推測し、静的な世界と動的な世界の両方の長所を提供します。 Rustの型推論エンジンは非常にスマートです。これは、初期化中にr値のタイプを見る以上のことを行います。また、変数のタイプを推測するために後で変数がどのように使用されるかについても調べます。 Swiftは型推論を使用して適切な型を算出します。型推論により、コンパイラは、指定した値を調べるだけで、コードをコンパイルするときに特定の式の型を自動的に推測できます。

9
理論上のTDDのみ
1年ちょっと前、幸運にも9か月の休憩をとることができました。その時に、C#のスキルを磨くことにしました。私は多くのプロジェクトに取り組み始め、TDDに従うことを余儀なくされました。 それはかなり啓発的なプロセスでした。 最初は大変でしたが、時間が経つにつれて、よりテスト可能なコードを作成する方法を学びました(実際には、よりソリッドなコードになる傾向があります)。 今、私は労働力に戻り、奇妙なことに気づいています。 私はTDDに従わないことを好みます。 TDDを使用すると速度が遅くなり、実際にクリーンなアプリケーションを設計するのが難しくなります。 代わりに、私はわずかに(大規模に)異なるアプローチを採用しました。 作業の垂直スライスを選択します 機能するプロトタイプを開発する すべてが整頓されるまでリファクタリングする 私が書いた美しく固くてテスト可能なコードに感謝します。 お気づきかもしれませんが、ステップ1は「テスト対象のパブリックサーフェスを定義する」わけではなく、ステップ2は「パブリックサーフェスからベジェスをテストする」わけではありません。また、どのステップにもテストが含まれていないことに気づいたかもしれません。私はテスト可能なコードを書いていますが、まだテストしていません...まだまだです。 ここで、実際にどのような種類のテストも行っていないことを明確にしたいと思います。私が書いているコードは動作します。手動でテストしているので機能します。 また、自動化されたすべてのテストを行っているわけでもないことを明確にしたいと思います。これは私のプロセスが異なるところです。そして、これが私がこの質問をする理由です。 理論的にはTDD。実際にはありません。 私のプロセスは少し進化しており、TDDと、非常に生産的で合理的に安全であると思われるテストとのバランスを取りました。次のようになります。 テストを念頭に置いて作業の垂直スライスを実装しますが、テストは作成しません。 そのスライスを修正する必要がある場合(1か月後など) 作業のスライスが正しいことを保証する単体テスト、統合テスト、動作テストなどを書く コードを修正する そのスライスを変更する必要がない場合、 何もしない テストを書く負担をコードを書く前から変更する前に単純にシフトすることで、はるかに機能するコードを生成することができました。そして、テストの作成に取り掛かるときには、作成するテストの数ははるかに少なくなりますが、ほぼ同じくらいの範囲(高いROI)をカバーします。 私はこのプロセスが好きですが、うまくスケールしないかもしれないと心配しています。その成功は、開発者が物事を変える前にテストを書くことに熱心であることにかかっています。そして、それはかなり大きなリスクのようです。しかし、TDDのリスクはまったく同じです。 だから、私は[BT] DD地獄に行くのですか、これは実用的なコーディングとテストの一般的な形式ですか? 私はこのように働き続けたいです。このプロセスを長期的に機能させるにはどうすればよいですか? 注意: 私は自分のプロジェクトの唯一の開発者であり、要件の収集、設計、アーキテクチャ、テスト、展開などすべてに責任があります。これが私のプロセスが機能している理由だと思います。

5
Javascript、HTML、およびCSS間の緊密な結合:より現代的なアプローチ?
要素を見つけ、データを保存し、イベントをリッスンするために、特定のセレクターにバインドされたJavascriptを見るのは非常に一般的です。これらの同じセレクターがスタイリングに使用されることもよく見られます。 jQuery(およびそのセレクターエンジンSizzle)は、CSSタイプの構文で要素を参照することにより、これをサポートおよび促進します。そのため、プロジェクトを構築するときに、この手法を「学習」(またはリファクタリング)することは特に困難です。 これはHTMLとJavascriptの開発の歴史の結果であり、この種のカップリングを効率的に消費/解析/レンダリングするためにブラウザーが構築されていることを理解するようになりました。しかし、Webサイトがますます複雑になるにつれて、この現実により、これらの個別のレイヤーを整理および維持するのが難しくなります。 私の質問は、これは現代のウェブサイトで回避できますか? 私がフロントエンド開発に不慣れで、「正しい方法」で学習したい場合、そのような依存関係を最初から切り離して回避することを学ぶ価値はありますか?これは、より分離された構造を促進するライブラリを支持してjQueryを避けることを意味しますか?
29 javascript  html  css  jquery 

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