ソフトウェア工学

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

4
XSLTがWeb上であまり使用されないのはなぜですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 閉じた2年前。 XSLTは成熟した、広く受け入れられている標準です。 ブラウザー(古いIEでも)およびサーバー側で使用できます(nginxにはXSLTモジュールがあり、もちろんプログラミング言語から使用できます)。その実装はコンパイルされているため、PythonやJSよりもはるかに高速である必要があります。JS実装Saxon JSは、少なくともフォールバックとして使用できます。Jinja、Angular、RubyのSlim、ASP、およびPHPのテンプレートは近いものではありません。 XSLテンプレートは、IDEで簡単に検証できます。JinjaまたはAngularに役立つIDEはいくつありますか? XSLTでUIとデータを分解するのは完璧なアイデアのようです。 確かに、実装はいくつかのコーナーケースで異なる結果を与える可能性がありますが、それはクライアント側でのテンプレート化だけの問題です。また、HTML、CSS、およびクライアント側で行われる他のすべてについても同じです。 それでは、なぜXSLTではありませんか?

4
プルリクエストが大きいときにコードレビューを改善するにはどうすればよいですか?
免責事項:同様の質問がいくつかありますが、大規模なプルリクエストのレビュー中に直面する問題に特に関係する質問は見つかりませんでした。 問題 私のコードレビューはもっと良い方法でできると思います。特に、20以上のファイルに多くの変更が加えられた大きなコードレビューについて話している。 明らかなローカルコードの問題をキャッチするのは非常に簡単です。ただし、コードがビジネス基準を満たしているかどうかを理解することは別の話です。 コード作成者の思考プロセスに従うのに苦労しています。変更が多数あり、複数のファイルに分散している場合は非常に困難です。特定の変更に関連するファイルのグループに焦点を当てようとしています。次に、グループを1つずつ確認します。残念ながら、私が使用しているツール(Atlassian Bitbucket)はあまり役に立ちません。私がファイルにアクセスするたびに、現在確認されている変更の一部に関連していないことがよくありますが、ファイルは表示済みとしてマークされます。言うまでもなく、一部のファイルは複数回アクセスする必要があり、それらの変更は個別にレビューされます。また、悪いパスをたどったときに関連するファイルに戻るのは簡単ではありません。 可能な解決策、およびなぜそれらが私にとってうまくいかないのか コミットによってプルリクエストを確認することでサイズの問題を解決できることがよくありますが、古い変更を頻繁に見ているので、私はそれが好きではありません。 もちろん、より小さなプルリクエストを作成することは改善策のように見えますが、それが何であるか、時には大きなプルリクエストを取得し、それをレビューする必要があります。 また、コード全体の論理的な側面を無視することもできますが、特にコードが経験の浅いプログラマーのものである場合は、かなりリスクが高いようです。 より良いツールを使用することは役立つかもしれませんが、私はそれを見つけませんでした。 ご質問 コードレビューで同様の問題がありますか?どのように彼らに直面しますか? たぶんあなたはより良いツールを持っていますか?

1
マイクロフロントエンドでパイプに送信される冗長コード
マイクロフロントエンドの私の理解は、彼らが解決する重要な問題は、企業が複数の可能な異なるチームを持ち、大規模なWebアプリケーションを構成するために使用される個々のコンポーネント/スモールアプリで作業するのを支援することです。 ここで解決されている重要な問題は、複数のチームが独立して作業し、大規模なコンポジットを構築できる能力です。問題は、エンドユーザー向けに無駄のないリリースバンドルを用意することではありません。その理解は正しいですか? 大きなWebアプリケーションを作成するために複数のスモールアプリを使用している場合、同じJavascriptライブラリ(Lodashなど)をエンドユーザーのブラウザーに配送する複数のスモールアプリを潜在的に含めることができるというのは本当ですか?個々のベンダーバンドルは、ある程度の重複/冗長コードがユーザーに送信される原因になりますか? これは、フロントエンドアプリケーションの設計中に心配する必要がある問題ではありませんか?

5
抽象クラスを既に持っている場合、インターフェイスを定義するのは理にかなっていますか?
いくつかのデフォルト/共有機能を持つクラスがあります。私abstract classはそれを使用します: public interface ITypeNameMapper { string Map(TypeDefinition typeDefinition); } public abstract class TypeNameMapper : ITypeNameMapper { public virtual string Map(TypeDefinition typeDefinition) { if (typeDefinition is ClassDefinition classDefinition) { return Map(classDefinition); } ... throw new ArgumentOutOfRangeException(nameof(typeDefinition)); } protected abstract string Map(ClassDefinition classDefinition); } ご覧のとおり、インターフェイスもありますITypeNameMapper。私がすでに抽象クラスを持っているTypeNameMapperか、それでabstract class十分な場合、このインターフェイスを定義するのは理にかなっていますか? TypeDefinition この最小限の例でも抽象的です。

4
無意味なデフォルト値を持つ構造体
私のシステムでは、私は頻繁に空港コード(で動作し"YYZ"、"LAX"、"SFO"、など)、彼らはまったく同じ形式(大文字として表現3文字)に常にあります。システムは通常、APIリクエストごとにこれらの(異なる)コードの25〜50を処理し、合計で1,000を超える割り当てが行われ、アプリケーションの多くのレイヤーを通過して、頻繁に同等性が比較されます。 最初は文字列を渡すだけで、少しはうまくいきましたが、3桁のコードが予期される場所に間違ったコードを渡すことで、多くのプログラミングの間違いにすぐに気付きました。また、大文字と小文字を区別しない比較を行うことになっていた問題に遭遇しましたが、代わりにそうしなかったため、バグが発生しました。 このことから、文字列の受け渡しを停止してAirport、空港コードを取得して検証する単一のコンストラクターを持つクラスを作成することにしました。 public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || !char.IsLetter(code[0]) || !char.IsLetter(code[1]) || !char.IsLetter(code[2])) { throw new ArgumentException( "Must be a 3 letter airport code.", nameof(code)); } Code = code.ToUpperInvariant(); } public string …

5
削除するアイテムが指定されていない場合、サービスは例外をスローするかリターンする必要があります
次のように表すことができるコードがあります: public class ItemService { public void DeleteItems(IEnumerable<Item> items) { // Save us from possible NullReferenceException below. if(items == null) return; foreach(var item in items) { // For the purpose of this example, lets say I have to iterate over them. // Go to database and delete them. } } …

1
プラットフォーム依存の参照を使用して、WindowsおよびMac用の.Netライブラリを作成する方法はありますか?
C#を使用して、デスクトップ(WindowsおよびMac)用のクロスプラットフォームアプリを開発しようとしています。このアプリにはプラットフォームに依存するものが大量に含まれており、チームリーダーはそのコードをすべてC#で記述することを望んでいます。これを行う簡単な方法は、C ++でラッパーを作成し、C#コードでライブラリを参照するだけで、C ++ライブラリがプラットフォームの問題を処理できるようにすることです。 Visual Studio for Macを使用してライブラリをセットアップしようとしています。単一のライブラリに単一のインターフェイスを提供して、現在のプラットフォームの音声ライブラリへのネイティブテキストへのアクセスを許可することを望んでいます。できれば2つのアセンブリを作成する必要はありません。C#for Windowsのテキスト読み上げライブラリはMacでは利用できないため、ブリッジを提供する以外の選択肢はありません。 ライブラリでオペレーティングシステムのルックアップを実行して、どのオペレーティングシステムで実行されているかを判断したり、ネイティブライブラリのロードを試みたり、ロードするライブラリを使用したりすることに満足しています。 必要に応じて、2つの実装を記述できる単一のプロジェクトを作成する必要があります。Visual Studio for Macでライブラリプロジェクトを作成する方法を見つけられませんでしたが、作成できるようになります。複数の実装を許可するプロジェクトの唯一のタイプは、実装がiOSまたはAndroidのいずれかであることを必要とするようです。

5
2つのサーバーに照会し、最速の応答のみを消費することは、どのような条件で(もしあれば)良い習慣ですか?
なぜjavascriptを使用するのかについて、コミュニティで削除された質問をSOに尋ねましたPromise.race。 何らかの値を計算する2つのサービスがある場合、それらを並行してクエリし、1つをクエリし、失敗を待ってから2番目をクエリするのではなく、最初に返される値を使用できます。 私は冗長性とこのユースケース全般についてグーグルで調べましたが、何も見つかりませんでしたし、POVから、応答を使用しない場合はサーバー/サービスにワークロードを追加することは決して良い考えではありません。

2
アプリの一部が異なる言語で記述されている場合、データ構造の重複を回避するにはどうすればよいですか?
例として、Javaでアプリを書いているとしましょう。 アプリは、Pythonで記述されたAPIサーバーと通信します。 PythonサーバーはSQLデータベースと通信します。 JavaScriptで記述されたアプリのWebサイトもあります。 4つの異なる言語を使用すると、本質的に同じデータ構造を4回異なるものにするのは簡単です。 たとえば、User型は次のようになります(擬似コード): type User { integer id; string name; timestamp birthday; } プロジェクトのすべての部分には何らかの表現が必要でしょうUser。JavaパーツとPythonパーツには、2つの異なるclass宣言が必要です。データベースにはUserテーブル宣言が必要です。そして、フロントエンドサイトUserも代表する必要があります。 このタイプを4回繰り返すことは、「繰り返しはしない」という原則に反します。また、Userタイプが変更された場合、プロジェクトのさまざまな部分でこれらの変更を繰り返す必要があるという問題があります。 Googleのprotobufライブラリは、特殊な構文を使用してデータ構造を記述し、ライブラリが複数の異なるプログラミング言語で構造宣言を生成するというこの問題に対する一種のソリューションを提供することを知っています。しかし、これでも型の検証ロジックを繰り返さなければならないという問題には対応していません。 これに関する本やブログの投稿への提案やリンクはありますか?

4
クラスは、実装するメソッドのサブセットをユーザーにどのように伝える必要がありますか?
シナリオ WebアプリケーションはIUserBackend、メソッドを使用してユーザーバックエンドインターフェイスを定義します getUser(uid) createUser(uid) deleteUser(uid) setPassword(uid、password) ... 異なるユーザーバックエンド(LDAP、SQLなど)がこのインターフェイスを実装しますが、すべてのバックエンドがすべてを実行できるわけではありません。たとえば、具体的なLDAPサーバーでは、このWebアプリケーションはユーザーを削除できません。したがって、LdapUserBackend実装IUserBackendするクラスはを実装しませんdeleteUser(uid)。 具体的なクラスは、Webアプリケーションがバックエンドのユーザーに対して許可されていることをWebアプリケーションと通信する必要があります。 既知の解決策 私は、要求されたアクションとビット単位でANDされたアクションのビット単位のORの結果である整数を返すメソッドをIUserInterface持っているソリューションを見ましたimplementedActions: function implementedActions(requestedActions) { return (bool)( ACTION_GET_USER | ACTION_CREATE_USER | ACTION_DELTE_USER | ACTION_SET_PASSWORD ) & requestedActions) } どこ ACTION_GET_USER = 1 ACTION_CREATE_USER = 2 ACTION_DELETE_USER = 4 ACTION_SET_PASSWORD = 8 .... = 16 .... = 32 等 そのため、Webアプリケーションは、必要なものでビットマスクを設定し、implementedActions()それらをサポートするかどうかをブール値で答えます。 意見 私にとってこれらのビット操作はC時代の遺物のように見えますが、きれいなコードの観点からは必ずしも簡単に理解できるとは限りません。 …

2
ユーザーが編集中のクラウドDBの行をロックする必要がありますか
データをクラウドに保持するデスクトップアプリケーションを作成しています。私が懸念していることの1つは、アプリケーション内のアイテムの編集を開始し、しばらくそれを残すとデータが古くなることです。これは、2人が同じアイテムを同時に編集しようとした場合にも発生します。編集を終えてデータを保存したい場合、データベースに現在存在するものを上書きするか、最後の変更後に編集を開始したことを確認し、変更を強制的に破棄するか、リスクを与えるオプションを与える必要があります他の人の変更を上書きする。 フィールドis_lockedをlock_timestampDBテーブルに追加することを考えました。ユーザーがアイテムの編集を開始すると、行がis_lockedtrueに変更され、ロックタイムスタンプが現在の時刻に設定されます。その場合、ロックが保持される時間(5分など)があります。他の誰かがアイテムを編集しようとすると、アイテムがロックされ、ロックが自動的に期限切れになるというメッセージを受け取ります。ユーザーがロックの編集中に立ち去ると、比較的短時間でロックが自動的に期限切れになり、ロックが期限切れになったことがユーザーに警告され、データの更新後に強制的に編集が再開されます。 これは古いデータの上書きを防ぐ良い方法でしょうか?それは過剰です(アプリケーションが1つのアカウントで同時に数人以上のユーザーによって使用されるとは考えていません)。 (私が抱えているもう1つの懸念は、2人が同じアイテムのロックを取得することですが、それは私が快適な競合状態だと思います。)

3
新しいCプロジェクトは、非常に古いC標準(20年以上前、つまりC89)をターゲットにする必要がありますか?
ときどき、非常に古いC標準(通常はC89)をターゲットとする、比較的新しく、オープンソースの主要なCプロジェクトを目にします。例はsystemdです。これらのプロジェクトには実力のある優秀な人材がいるので、おそらく私には分からないこの決定の背後にある合理的な根拠があるでしょう。疑いの利点は別として、論理的結論はFORTRANがCよりも優れており、COBOLはFORTRANよりも優れているという論理的な結論になるため、理論的根拠は「より古く標準化されたものは常により移植性が高く、より優れている」ように思われます。 新しいCプロジェクトが非常に古いC標準を対象とすることはいつ、そしてなぜ正当化されますか? ユーザーのシステムが絶対にCコンパイラーを更新してはならないが、そうでなければ新しいソフトウェアを自由にインストールできるシナリオを想像することはできません。たとえば、DebianのLTSバージョンには、C99およびC11の一部をサポートするgcc 4.6パッケージがあります。しかし、奇妙なシナリオが存在しなければならず、systemdのようなプログラムがそれらのユーザーをターゲットにしていると思います。 私が想像できる最も合理的なユースケースは、ユーザーがC89コンパイラーのみが利用できるエキゾチックなアーキテクチャーを持っていると予想されるが、彼らは完全に新しいソフトウェアをインストールすることをいとわない場合です。命令セットアーキテクチャの多様性の低下を考えると、それは過度に仮説的なシナリオのように思えますが、私にはわかりません。
12 c  standards 


5
品質の改善を期待してコードをミニリファクタリングすることは有用ですか、それとも単に「コードを移動する」だけのメリットがありますか?
例 データベースからデータをロードし、HTMLマークアップを表示し、ルーター/コントローラー/アクションとして機能する「すべて」を行うモノリシックコードに出会いました。データベースコードを独自のファイルに移動するSRPを適用し始め、物事の命名を改善しましたが、すべてが見栄えが良かったのですが、なぜこれを行っているのか疑問に思い始めました。 リファクタリングする理由 目的は何ですか?役に立たない?利点は何ですか?モノリシックファイルはほとんどそのままにしておきましたが、作業を行う必要がある領域に関連する小さな部分のみをリファクタリングしたことに注意してください。 元のコード: 具体的な例を挙げると、このコードスニペットに出会いました。既知の製品IDまたはユーザーが選択したバージョンIDのいずれかで製品仕様を読み込みます。 if ($verid) $sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid); else $sql1 = "SELECT * FROM product_spec WHERE product_id = " . clean_input($productid) ; $result1 = query($sql1); $row1 = fetch_array($result1); /* html markup follows */ リファクタリング: この特定のコード部分を変更する必要がある作業を行っているため、リポジトリパターンを使用するように変更し、オブジェクト指向のMySQL機能を使用するようにアップグレードしました。 //some implementation details …

5
外部コード内の任意の関数/クラスへの呼び出しを禁止する
システムでの負の結果を防ぐために、外部ライブラリとフレームワークのAPIへのアクセスを制限することが重要になる場合があります。 たとえば、SharePointアプリケーションではspList.Items.GetItemById、ループ内であっても、リストアイテムを取得するために呼び出すのが自然に思えるかもしれません。 また、テスト環境ですべての電子メールを適切にプロキシおよびモックできるように、全員に独自のクラスを使用して電子メールを送信させるために、SmtpClientの使用を禁止する必要がある場合もあります。 独自のコードの特定の特定の場所を除き、外部コードでこれらの制約を達成するための信頼できる合理的な方法はありますか?すべての状況下で、これらのメソッド/クラスへのアクセスを完全に禁止する必要はありません。たとえば、リフレクションまたは何らかの無効化によって、それらを使用しないことを厳しく警告する必要があります。できればプログラマーに積極的にこれらの制約を無効にするための措置をとるように強制します。

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