今後のことも考えて、断面の情報をインスタンスで受け渡せるように、ビルドH断面にプロパティを設定する。
プロパティはSTBに合わせて作成する。
さて、ここで初期化を楽にするためにコンストラクタを作成しようとしたのだが、いろいろ苦戦してしまった。
鉄骨断面の場合、寸法を入れなくても鉄骨形状の文字列で指定できれば、寸法を入れなくてもよいというルールになっている。
そうすると、初期化は3パターンある。
- constructor(a,b,t1,t2)と寸法を入れるケース
- constructor(name)と鉄骨形状を入れるケース
- constructor(name,a,b,t1,t2)とすべてを設定するケース
C#などであれば、コンストラクタを複数オーバーロードすればいいかな、と思うんだけど、typescriptはオーバーロードがそんな感じでできない。
オーバーロードはできるのだが、実装の仕方が、引数と戻り値を定義した後、実装自体は一つの関数で行う必要があり、引数のタイプを取得してif文とかで場合分けして実装するというやり方になる。
最初これをやろうとしたのだけど、すさまじく長ったらしくなる。
undefinedの処理があったりするし、ほかにもa,b,t1,t2の位置がずれるので引数名の位置がずれたりとあまり好ましくない。
どう書いてもあまりきれいに書けなかったので、数時間格闘した挙句コンストラクタはあきらめた・・・。
しょうがないので、インスタンスは引数なしで作成し、寸法を初期化できるsetDimensionsメソッドを作ってお茶を濁す。
コンストラクタは今後の課題送りということで。
せっかくなので寸法を入れたら自動でnameセットする処理を入れておく。
そのうち、逆にnameを入れたら寸法が入るメソッドも用意したい。
結果、シンプルな形に。
sec/build-h.ts
import { Unit } from "../unit"; /** * 組立H形鋼 */ export class SecBuildH { /** 形状名 */ name: string = ""; /** 成 A */ a: number = 0.0; /** フランジ幅 B */ b: number = 0.0; /** ウェブ厚 t1 */ t1: number = 0.0; /** フランジ厚 t2 */ t2: number = 0.0; /** * 寸法により初期化し、nameも設定する * @param a 成A * @param b フランジ幅 B * @param t1 ウェブ厚 t1 * @param t2 フランジ厚 t2 */ setDimensions(a: number, b: number, t1: number, t2: number) { this.a = a; this.b = b; this.t1 = t1; this.t2 = t2; const scale: number = Unit.output(1.0, "mm"); a *= scale; b *= scale; t1 *= scale; t2 *= scale; this.name = `BH-${a}x${b}x${t1}x${t2}`; } //中略 }
テストで、寸法をそれぞれのテストで指定していたものを、buildHのインスタンスを作ることで、数値の入れる箇所を減らした。
引数の部分が改行されて行数はあまり減らなかったが。
SecBuildHにプロパティと初期化用メソッドを追加 · st-func/st-func-ts@38bbece · GitHub