ソフトウェア工学

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

9
Javaに `void`メソッドがあるのはなぜですか?
Javaにvoidメソッドが必要なのはなぜですか?参照: voidと宣言されたメソッドは値を返しません。 私の考えている限り、のすべての使用はvoid、ステータスフラグ、呼び出されているオブジェクト、またはを返すことにより、より適切に機能しますnull。 これにより、すべての呼び出しが割り当て可能なステートメントになり、ビルダーパターンとメソッドチェーンが容易になります。通常、効果のためにのみ呼び出されるメソッドは、ブールSuccess型またはジェネリック型を返すか、失敗すると例外をスローします。

8
C ++のゴミはどうなりますか?
Javaには自動GCがあり、たまに世界を停止しますが、ヒープ上のゴミを処理します。現在、C / C ++アプリケーションにはこれらのSTWフリーズがなく、メモリ使用量も無限に増加しません。この動作はどのように達成されますか?死んだオブジェクトはどのように処理されますか?

9
外部APIからの予期しない値から保護する必要がありますか?
外部APIから入力を受け取る関数をコーディングしているとしましょうMyAPI。 その外部APIにMyAPIは、a stringまたはa を返すことを示す契約がありnumberます。 それはのようなものから保護することをお勧めしますnull、undefined、booleanそれはのAPIの一部ではないにもかかわらずなど、MyAPI?特に、そのAPIを制御することはできないため、静的型分析などの方法で保証することはできません。 私はロバストネスの原則に関連して考えています。

10
「お住まいの地域ではサービスを利用できません」というエラーのHTTPステータスコードは何ですか?
現在、5つの都市でサービスを提供しています。誰かが他の都市からサービスAPIを呼び出そうとした場合、このエラーをスローしますService not available in your area。 問題は、このエラーに適切なhttpコードは何ですか? 503:サービスを利用できません 403禁止します または、他の何か?
51 api  api-design  http 

7
誰も経験のない過度に複雑なセットアップを選択するPM [非公開]
最近、私は作るのが難しくないように思えるプロジェクトを始めました。コンセプトは、時々入力を受け入れなければならないかなりシンプルなアプリケーションであり(おそらく1日10倍)、それらに対していくつかの操作を実行し、すべての結果を収集しようとしました最後に。その後、このアプリケーションは、顧客が結果を表示するために使用できるフロントエンドWebポータルを取得しますが、ロケット科学そのものではありません。 このために、私は最初にPythonの組み込み同時実行ライブラリ(ThreadPoolExecutor)をスマートに使用し、フロントエンドに使いやすいライブラリを使用しました(初心者には簡単で、保守とテストが比較的簡単なため、Flaskを選択しました)。 プロジェクトの半分に達した後、PMは、スレッドの代わりにサードパーティのメッセージキュー機能を使用する必要があり、負荷分散を実装する必要があると述べました。最終的に起こったことは、最終的にCelery、Redis、RabbitMQ、Nginx、uWSGIそして、誰も実際に経験したことのない他の大規模なサードパーティサービスの束。 最終的に、これはスパゲッティコードの束、テスト不能なタスク(サードパーティライブラリの複雑さ、コードのパッチ適用が機能しなかったため)、およびこれらのサービスの付加価値が誰にもわからないために頭痛の種につながります。 「はい、これらのサービスを使用する必要があります」と言う前に、誰もこれらの使用方法を知らないか、競合状態に悩まされているコードを導入する以外に彼らが何をするかさえ知らないことに留意してください。 これについてどうすればよいですか?この時点では、最終製品が当初よりも悪くなったとしても、私たちが持っていたものに戻すにはコストがかかりすぎ、PMはこれらのサービスを使用することに行き詰まっています。彼とこれについて議論するのに使用さえありますか?もっと時間が必要ですか?または厳しい答えは、私は自分の仕事にはあまりにも愚かですか?


3
SOAPの現在の意味は何ですか
最後に、SOAPベースのサービスに出くわしたのは、2013年に金融会社でインターンシップを行っていたときです。それが、ITでのキャリアを始めたときでした。私のエンジニアリングコースの1つで、SOAPについての学習資料を持っていたことを覚えています。それ以外では、私はキャリアの中でSOAPをあまり使用していません。 「SOAPとRESTの違い」という質問が最近のインタビューの1つで出てきたので、私はこれを尋ねています。私が知っていること(およびGoogleで発見したこと)から、SOAPは、ビジネスロジックに密接に関連する情報交換のためにクライアントとサーバーを密結合したプロトコルです。一方、RESTはデータ転送のためのより柔軟なステートレスアーキテクチャです。 SOAPとRESTのこの違いについて間違っている場合、誰かが私を修正してくれますか?また、SOAPの現在の重要性は何ですか?人々はまだ新しいSOAPベースのAPIを開発していますか、それとも今はほとんどレガシーですか?
51 rest  api  web-services  soap 

7
期限付きのTODOコメント?
バックグラウンド 私は、ゼロダウンタイム展開の実装を検討しているチームで働いています。これを実現するために、ブルー/グリーン展開戦略の使用を計画しています。研究を行う上で私が理解していることの1つは、データベースの変更を行うことがどれほど複雑になるかです。カラムの名前を変更するなどの簡単な操作は、完了するまで3回の完全なリリースサイクルを必要とします。 変更の完全なロールアウトに複数のリリースサイクルがかかると、ヒューマンエラーが発生する可能性が大きくなるように思えます。リンクされた記事では、2つのリリースにはコードの変更が必要であり、3つのリリースにはデータベースの移行が必要であることを示しています。 私が探しているもの 現在、何かを行うことを覚えている場合は、問題管理システムでチケットを作成できます。または、TODOコメントを作成することもできますが、おそらく完全に忘れられます。 私が探しているのは、TODOコメントに期限があり、この期限が切れた場合、継続的インテグレーションシステム(現在使用する未定)がビルドを拒否する方法です。 たとえば、列の名前を変更する場合、最初の移行を作成し、次に2つのTODOコメントを作成して、残りの2つの移行が作成されるようにします。 // TODO by v55: Create migration to move constraints to new column, remove references to old column in app // TODO by v56: Create migration to drop old column これは実装するのはかなり簡単に思えますが、車輪の再発明をしたくないので、このようなものがすでに存在するかどうか疑問に思っています。 追加の考え ローリングデプロイメントとブルー/グリーンデプロイメントがベストプラクティスであると考えられるため、ここでXYの問題に苦しんでいるように感じます。データベースの更新の痛みを軽減するソリューションを見つけることができないのは奇妙に思えます。私が間違っていることを完全に調査していると思われる場合は、コメントでお知らせください!とはいえ、私が挙げたデータベースの例はほんの一例に過ぎず、期日付きのTODOコメントは他の状況でも役立つと思うので、この特定の状況に近づいていたとしても、私は本当に自分の答えにしたい実際の質問も。ありがとう! 編集:これが役立つ別の状況を考えました。機能のトグルを使用して、準備ができたときにアプリの一部を有効にする場合、それらをクリーンアップするように注意する必要があります。そうしないと、Toggle Debtになる可能性があります。期限付きのコメントは、これを思い出す良い方法です。

5
パックマンのゲームの「レベル256バグ」は、未処理のセグメンテーション違反と見なすことができますか?
私はセグメンテーションフォールトを誰かに説明しようとしていますが、Pacmanのレベル256キルスクリーン、整数オーバーフローによってトリガーされる方法、およびセグメンテーションで説明されている「不明な状態」と動作がどのように似ているかを考えていました障害。 これは私が「未処理のセグメンテーション違反」と呼ぶものの良い例だと言いたいのですが、誤った情報を広める可能性がある前にセカンドオピニオンを得たいと思います。 調べてみましたが、バグ自体に関するドキュメントと、Hipster WhaleとNamcoの間のコラボレーションだけが手に入ります。 それで、Pacmanのレベル256の動作は、未処理のセグメンテーション違反の例だと考えますか?
51 memory  errors 

8
マルチスレッドJavaScriptランタイム実装を作成することの欠点は何ですか?[閉まっている]
この1週間、マルチスレッドJavaScriptランタイムの実装に取り​​組んでいます。JavaScriptCoreとboostを使用して、C ++で作成した概念実証があります。 アーキテクチャは単純です。メインスクリプトの評価が完了すると、ランタイムは起動してスレッドプールに参加します。スレッドプールは、共有優先度キューからタスクを選択し始めます。2つのタスクが同時に変数にアクセスしようとすると、アトミックとマークされ、アクセスを争います。 問題は、この設計をJavaScriptプログラマーに見せると、非常に否定的なフィードバックが得られ、その理由がわからないことです。非公開でも、JavaScriptはシングルスレッドである必要があり、既存のライブラリを書き換える必要があり、作業を続けるとグレムリンがすべての生物を生成して食べると言う。 私はもともとネイティブのコルーチン実装(ブーストコンテキストを使用)も配置していましたが、それを捨てなければなりませんでした(JavaScriptCoreはスタックについてはしゃれています)。 どう思いますか?JavaScriptはシングルスレッドを対象としていますが、JavaScriptはそのままにしておくべきですか?誰もが同時JavaScriptランタイムのアイデアに反対しているのはなぜですか? 編集:プロジェクトは現在GitHubにあります。自分で試してみて、あなたの考えを教えてください。 以下は、競合なしですべてのCPUコアで並行して実行されるプロミスの図です。

8
コンテンツで検索する必要がある大規模なデータセットでは、NoSQLデータベースの使用は非実用的ですか?
1週間、NoSQLデータベースについて学んでいます。 NoSQLデータベースの利点と、それらが優れている多くのユースケースを本当に理解しています。 しかし、多くの場合、NoSQLがリレーショナルデータベースを置き換えることができるかのように記事を書きます。そして、頭を動かせない点があります。 NoSQLデータベースは(多くの場合)キーと値のストアです。 もちろん、(JSON、XMLなどでデータをエンコードすることで)すべてをキーと値のストアに保存することは可能ですが、多くの場合、特定の基準に一致するデータを取得する必要があるという問題がありますユースケース。NoSQLデータベースでは、効果的に検索できるキーは1つだけです。リレーショナルデータベースは、データ行の任意の値を効果的に検索するように最適化されています。 そのため、NoSQLデータベースは、コンテンツで検索する必要がある永続的なデータには実際には選択できません。または、私は何かを誤解しましたか? 例: Webショップのユーザーデータを保存する必要があります。 リレーショナルデータベースでは、すべてのユーザーをusersテーブルの行として、ID、名前、国などとともに保存します。 NoSQLデータベースでは、各ユーザーを自分のIDをキーとして、すべてのデータ(JSONなどでエンコードされた)を値として保存します。 したがって、特定の国からすべてのユーザーを取得する必要がある場合(何らかの理由でマーケティング担当者が彼らについて何かを知る必要があります)、リレーショナルデータベースでは簡単に行えますが、NoSQLデータベースではあまり効果的ではありません。すべてのユーザーを取得し、すべてのデータを解析してフィルターします。 私はそれが不可能だとは言いませんが、それははるかにトリッキーになり、NoSQLエントリのデータを検索したい場合はそれほど効果的ではないと思います。 この国に住んでいるすべてのユーザーのキーを格納する国ごとにキーを作成し、この国のキーに保管されているすべてのキーを取得することで特定の国のユーザーを取得できます。しかし、この手法により、複雑なデータセットはさらに複雑になります。SQLデータベースへのクエリほど実装が難しく、効果的ではありません。ですから、本番環境で使用する方法ではないと思います。またはそれは? そのようなユースケースを処理するために、何かを誤解したり、いくつかの概念やベストプラクティスを見落としたりしたかどうかは、本当にわかりません。たぶん、あなたは私の声明を修正し、私の質問に答えることができます。

13
他のおそらく有害な機能とは対照的に、なぜevalのような機能は悪と見なされますか?
ほとんどの現代言語(何らかの方法で解釈される)には、ある種の評価関数があります。このような関数は任意の言語コードを実行します。ほとんどの場合、文字列としてメイン引数として渡されます(異なる言語はeval関数により多くの機能を追加する場合があります)。 特にサーバー側のソフトウェアでは、悪意のあるコードをプロセスに実行させる可能性があるため、ユーザーがこの機能を実行することを許可しないことを理解しています(編集、つまり任意のユーザーからの任意の入力を直接または間接的に取得して渡されますeval)。そのようにして、チュートリアルとコミュニティはevalを使用しないように指示します。ただし、evalが便利で使用される場合が多くあります。 ソフトウェア要素へのカスタムアクセスルール(IIRC OpenERPには、ir.rule動的なPythonコードを使用できるオブジェクトがあります)。 カスタム計算および/または基準(OpenERPには、カスタムコード計算を可能にするようなフィールドがあります)。 OpenERPレポートパーサー(はい、私はあなたをOpenERPのものでおかしくしていることを知っています...しかし、それは私が持っている主な例です)。 一部のRPGゲームでのスペルエフェクトのコーディング。 したがって、それらは適切に使用されている限り、有効に使用されます。主な利点は、この機能により、管理者が追加のファイルを作成してそれらを含めることなくカスタムコードを記述できることです(ただし、eval機能を使用するほとんどのフレームワークには、ファイル、モジュール、パッケージなどを指定して読み込む方法があります)。 ただし、大衆文化ではevalは悪です。システムに侵入するようなものが思い浮かびます。 ただし、ユーザーが何らかの方法でアクセスすると有害になる可能性のある他の機能があります:リンク解除、読み取り、書き込み(ファイルのセマンティクス)、メモリ割り当てとポインター演算、データベースモデルアクセス(SQLインジェクタブルのケースを考慮しない場合でも)。 だから、基本的には、ほとんどの時間を任意のコードが書かれていませんが、適切かどうか見て適切に(リソース、ユーザ、環境、...)は、コードが悪であるとさえ経済的影響につながることができます。 しかし、eval関数には特別なものがあります(言語に関係なく)。 質問:他の危険な要素に同じ注意を払うのではなく、この恐怖が大衆文化の一部になるという歴史的な事実はありますか?

2
実際、Gitブランチは「Hilbert空間の部分多様体をマッピングする同相内体関数」ですか?
誰もが知っているように: ブランチがHilbert空間の部分多様体をマッピングする同相内体関数であることを理解すると、Gitはより簡単になります これは専門用語のように見えますが、一方で、 つまり、XのモナドはXのエンドファンクターのカテゴリーのモノイドであり、積×はエンドファンクターの構成とアイデンティティエンドファンクターによって設定された単位に置き換えられます。 で、それは本当であるので面白いです。 この簡単なテキストを読むことで、間違いのマージを回避できますか?
51 git 

4
PHPの変数の支配的な命名規則は何ですか:キャメルケースまたはアンダースコアですか?[閉まっている]
コンセンサスは、開発対象のプラットフォームの規則に従う必要があるということです。見る: アンダースコアまたはラクダケース? 命名規則:camelCase対underscore_case? ただし、PHPはメソッドや関数(mysqli::set_local_infile_default、 など)についても、内部的には規則に厳密に従っていないようです(そこに驚くことはありませんPDOStatement::debugDumpParams)。ただし、関数名ではアンダースコアが支配的であるようです。 しかし、私が見つけることができなかったのはこれでした:PHPの変数の支配的な命名規則は何ですか?

5
IOCコンテナがOOP原則を破る
IOCコンテナの目的は何ですか?組み合わされた理由は、次のように簡略化できます。 OOP / SOLID開発の原則を使用する場合、依存関係の注入が面倒になります。下位レベルの複数のレベルの依存関係を管理し、構築を通じて依存関係を再帰的に渡す最上位のエントリポイントがあるか、必要に応じて依存関係を構築するファクトリー/ビルダーパターンおよびインターフェイスにコードが多少重複しています。 これを実行するには、何のOOP / SOLID方法はありませんと、超きれいなコードを持っているが。 前のステートメントが正しい場合、IOCコンテナーはどのようにそれを行いますか?私の知る限り、それらは手動のDIでは実行できない未知の手法を使用していないため、IOCコンテナは静的オブジェクトのプライベートアクセッサを使用してOOP / SOLID原則を破ることだけです。 IOCコンテナは、背後で次の原則を破っていますか?私はよく理解しているので、これは本当の質問ですが、他の誰かがより良い理解を持っていると感じています スコープ制御。スコープは、コード設計に関するほとんどすべての決定の理由です。ブロック、ローカル、モジュール、静的/グローバル。スコープは、ブロックレベルでできるだけ多く、静的でできるだけ少なくする必要があります。宣言、インスタンス化、およびライフサイクルの終了が表示されます。言語とGCは、明示的に明示している限り、スコープを管理することを信頼しています。私の研究では、IOCコンテナがほとんどまたはすべての依存関係を静的として設定し、バックグラウンドでAOP実装を介して制御していることがわかりました。したがって、何も透明ではありません。 カプセル化。カプセル化の目的は何ですか?なぜプライベートメンバーを保持する必要があるのですか?実際的な理由により、APIの実装者は、状態(所有者クラスによって管理される必要があります)を変更して実装を中断することはできません。しかし、セキュリティ上の理由から、メンバー状態を追い越し、検証とクラス制御をバイパスするインジェクションが発生しないようにします。したがって、プライベートメンバーへの外部アクセスを許可するためにコンパイル時間の前に何らかの形でコードを挿入するもの(モックフレームワークまたはIOCフレームワーク)は非常に巨大です。 単一責任の原則。表面的には、IOCコンテナは物事をよりきれいにするようです。しかし、ヘルパーフレームワークなしで同じことを達成する方法を想像してください。十数個の依存関係を持つコンストラクターが渡されます。それはIOCコンテナーでそれをカバーすることを意味するものではありません、それは良いことです!コードをリファクタリングし、SRPに従うことを示すサインです。 オープン/クローズ。SRPがクラスのみではないように(メソッドはもちろん、SRPを単一の責任ラインに適用します)。Open / Closedは、クラスのコードを変更しないという単なる高レベルの理論ではありません。プログラムの構成を理解し、何が変更され、何が拡張されるかを制御する習慣です。IOCコンテナは、次の理由でクラスの動作方法を完全に変更できます。 a。主なコードは依存関係の切り替えを決定するのではなく、フレームワークの構成です。 b。スコープは、呼び出し元のメンバーによって制御されていないときに変更される可能性があり、代わりに静的フレームワークによって外部で決定されます。 したがって、クラスの構成は実際には閉じられていません。サードパーティのツールの構成に基づいて変更されます。 これが質問である理由は、私が必ずしもすべてのIOCコンテナのマスターではないからです。また、IOCコンテナーのアイデアは素晴らしいものの、実装が不十分なことを覆い隠す外観にすぎません。しかし、外部のスコープ制御、プライベートメンバーアクセス、および遅延読み込みを実現するには、多くの重要な疑問の余地のある作業を継続する必要があります。AOPは素晴らしいですが、IOC Containersを介して達成される方法にも疑問があります。 私は、C#と.NET GCが期待どおりに動作することを信頼できます。しかし、コンパイルされたコードを変更して、手動で実行できないことに対する回避策を実行するサードパーティ製のツールに同じ信頼を置くことはできません。 EG:Entity Frameworkと他のORMは、厳密に型指定されたオブジェクトを作成してデータベースエンティティにマッピングし、CRUDを実行するための基本的な機能を提供します。誰でも独自のORMを構築し、OOP / SOLID原則を手動で従うことができます。しかし、これらのフレームワークは私たちを助けてくれるので、毎回車輪を再発明する必要はありません。一方、IOC Containersは、OOP / SOLID原則を意図的に回避し、それを隠すのに役立つようです。

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