データ構造,アルゴリズム,デザインパターン総合スレ 3©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2016/06/19(日) 14:47:29.63ID:5KvSKdL/
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

データ構造,アルゴリズム,デザインパターン総合スレ 2
http://echo.2ch.net/test/read.cgi/tech/1362301811/

【関連スレ】
3Dアルゴリズム全般
http://toro.2ch.net/test/read.cgi/tech/1164171086/
<集大成>アルゴリズム大辞典
http://toro.2ch.net/test/read.cgi/tech/1086272325/
アルゴリズム総合スレ in ム板
http://toro.2ch.net/test/read.cgi/tech/1217773415/

アルゴリズムとデータ構造 - Kaneko Lab.
ttp://www.kkaneko.com/adp/algo/index.html
アルゴリズムとデータ構造 - ソースコード探険隊
ttp://www.codereading.com/algo_and_ds/
各種アルゴリズムの C++ による実装 - Spaghetti Source
ttp://www.prefield.com/algorithm/
アルゴリズムとデータ構造 - プログラミングスレまとめ in VIP
ttp://vipprog.net/wiki/algo_and_data_const.html
683デフォルトの名無しさん
垢版 |
2017/11/06(月) 23:54:10.39ID:Xbh99dPN
シングルトンがいけないとかたまに聞くんだけど
シングルトンなしでどうやるのか誰か教えて

シングルトン使わないで済むならシングルトン辞めることには吝かではないんだが
どうやるのかが分からない

HolderとかRepository作るとどうしてもシングルトンになっちゃう
誰か助けて
2017/11/07(火) 08:06:23.75ID:FkpvBRAi
シングルトンの何がいけないのかをわかっていれば別に使ってもいいんじゃないか?
と思うんだが
685デフォルトの名無しさん
垢版 |
2017/11/08(水) 03:27:16.05ID:pi2d/ZnM
staticでおk
686デフォルトの名無しさん
垢版 |
2017/11/10(金) 09:56:08.91ID:O+5a47Rv
内部ノード数 n の 2色木の Black Height を h であらわすと以下の不等式が成り立つ。

2^(h-1) - 1 ≦ n ≦ 2^(2*h-1) - 1

よって、 h = O(log(n))


とある本に書いてあります。

これっておかしいですよね?

h は n の関数ではありません。内部ノード数から2色木の Black Height は一意的にはきまらないからです。

もちろん、 O(log(n)) の左辺には n の関数が来るきまりです。

ですので、 h = O(log(n)) と書くのはおかしいのではないでしょうか?
687デフォルトの名無しさん
垢版 |
2017/11/10(金) 12:02:03.17ID:WtBM3Wp4
メッセージキューイングって
Commandパターンで実装するで合ってる?
2017/11/12(日) 17:56:18.04ID:5J9eZD00
>>686
>>2^(h-1) - 1 ≦ n ≦ 2^(2*h-1) - 1 ・・・(1)
>>よって、 h = O(log(n)) ・・・(2)

一見すると正しそうに見えるけど、どっちがどうおかしいと?
689デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:28:20.81ID:2NYvmr0h
h が n の関数ではないにもかかわらず

h ∈ O(log(n))

と書いているのがナンセンスです。
690デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:46:50.82ID:wWQbf7ET
>>689
nとhの関係は(1)で示されているんじゃね?
不等式を変形すれば良いのでは?
691デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:23:32.92ID:2NYvmr0h
n から h は一意的に決まりません。

よって、

h は n の関数ではありません。
2017/11/12(日) 21:38:49.52ID:wkhRVmHI
>>691
(1)より一意に決まらなくても計算量は同じでしょ?
2017/11/13(月) 18:01:47.14ID:O+WFbO9G
>もちろん、 O(log(n)) の左辺には n の関数が来るきまりです。
ここの時点でおかしい
694デフォルトの名無しさん
垢版 |
2017/11/13(月) 18:49:03.12ID:TURt7nwr
>>693

何がおかしいのでしょうか?
695デフォルトの名無しさん
垢版 |
2017/11/14(火) 16:22:50.14ID:kwaLWx7P
抽象メソッドしか定義されない型のことを
「インタフェース」ってネーミングセンスは頭おかしいんじゃないの?
インタフェースって言ったら通常「UI」とか外部の窓口になったり、
外部デバイスとの接続ポイントになるコネクタのことを言うじゃん。
オブジェクトの型のことを「インタフェース」なんて言ったら誤解を招くだろ。
696デフォルトの名無しさん
垢版 |
2017/11/14(火) 16:49:12.95ID:dN7NjwRx
>>695
interfaceには境界面とか接点の意味がある

クラスが持つ他との接点の意味で合ってる
2017/11/14(火) 18:46:26.43ID:9XknVuf7
外部の窓口になったり、外部デバイスとの接続ポイントになるのが抽象メソッドだから。
つまりそれしか定義されてないということは、インターフェースそのものと言っていいだろう。
2017/11/14(火) 20:12:16.44ID:R1CE9PkA
デザパタスキル、エンベッデイドスキルなんやかや言うが、みんな大事な部分は閃きなんだがなぁ・・・
作曲と同じ。 閃き・・・ とどのつまり、神が書かせているという事。
そこを理解できない限り、そのプログラマーは聖職では無い。
2017/11/15(水) 13:14:29.24ID:qga1lTtf
神などと妄想するようになったら科学の全否定の始まり。無知が故の過ち。
2017/11/18(土) 18:23:02.44ID:SgBQyEr/
神「共通化せよ――」
僕「はい」
神「ごめん間違えた――」
僕「うわぁぁああぁああ!!!」
2017/11/18(土) 18:29:25.85ID:ebkB7QGA
神とは強いて言えば可能性
702デフォルトの名無しさん
垢版 |
2017/11/19(日) 23:12:44.83ID:opsy6abA
以下で定義される写像 A : N × N → N を Ackermann 関数という。

A(1, j) = 2^j for j = 1, 2, 3, …
A(i, 1) = A(i-1, 2) for i = 2, 3, 4, …
A(i, j) = A(i-1, A(i, j-1)) for i = 2, 3, 4, … for j = 2, 3, 4, …

α(m, n) = min {i ≧ 1 | A(i, floor(m/n)) > log_2(n)}

で定義される写像 α : {(m, n) | m, n ∈ N, m ≧ n} → N を Ackermann 逆関数という。



なぜ、この α を Ackermann 関数の逆関数と呼ぶのでしょうか?
703デフォルトの名無しさん
垢版 |
2017/11/20(月) 20:37:12.88ID:Sdx1OtwZ
courseraのセジウィックとウエインの講義を受講しています。

プログラミングの課題のチェックが超厳しいですね。

'if' is not followed by whitespace.

「if」の後ろにスペースを入れないといけないなんて初めて聞きました。
そんなことまで強制されたらたまりませんね。
2017/11/20(月) 20:40:14.03ID:uYx1UAMq
大概のプロジェクトで採用されてるスタイルだから従っとけ
スペース軽視するやつ多すぎ
2017/11/20(月) 20:43:51.90ID:Y8ntE/6M
>>703
K&R2 に従っておけば文句が来ることはない
if ()
while ()
for ()
2017/11/20(月) 20:54:20.19ID:XqE+Nf2F
フオーマッタの設定の指定とか無いの?
2017/11/20(月) 23:10:14.23ID:ohy70QIE
一般的なコーディングルールには従ったほうがよい
最近の言語環境では放っておいてもツッコミ入れてくれたりもするが
2017/11/21(火) 07:03:23.42ID:G6ETZwfO
業務システムでオブジェクト指向不要って意見はどう思いますか
大抵スパゲティークエリになってる印象ですが
2017/11/21(火) 07:13:27.16ID:OOffmQFA
途中からオブジェクト指向混ぜられても困るだろ
実行効率や記述効率は悪くたって別に構わないのだから(ここわかってない人多し)、プロジェクトに来た全員が理解利用できる書き方が最優先

無論技術的にも業務的にもうんこだが、そこを追求すべき場所ではないところで勝手に追及を始めるのはそれこそうんこのやること
ゼロからオーバーホールを提案してもよいが最後まで自己責任で看取れ
2017/11/21(火) 17:43:16.86ID:M9cr/U+S
>>709
サブクエリ五重の塔を見て上長にキツいと報告したら世界にはバベルの塔がいっぱいあるのに根をあげるなと叱られました

せめて何をしたいのかドキュメント欲しいと言ったらコードが全てだとも言われました

IT業界の厳しさを知りました
2017/11/21(火) 18:14:34.60ID:3zrw9He/
>>710
マ板にどうぞ
712デフォルトの名無しさん
垢版 |
2017/11/22(水) 09:23:31.55ID:milfaijK
courseraのセジウィックとウエインの講義の最初の課題であるパーコレーションだけど
backwashを防ぐにはどうすればいいんですか?
713デフォルトの名無しさん
垢版 |
2017/11/22(水) 10:42:20.23ID:milfaijK
あ、分かりました。

virtual topにはつなぐがvirtual bottomにはつながないUF
virtual topにもvirtual bottomにもつなぐUF

を使えばいいんですね。
714デフォルトの名無しさん
垢版 |
2017/11/22(水) 10:51:20.09ID:milfaijK
成績が100点満点中97点になりました。
715デフォルトの名無しさん
垢版 |
2017/11/22(水) 10:52:40.54ID:milfaijK
成績が100点満点中98点になりました。
2017/11/22(水) 11:48:25.03ID:vqOaIl/E
今日のNG ID:milfaijK
717デフォルトの名無しさん
垢版 |
2017/11/22(水) 15:34:31.81ID:milfaijK
ついに、成績が100点満点中100点になりました。

https://imgur.com/apwKZnf.jpg
718デフォルトの名無しさん
垢版 |
2017/11/22(水) 15:35:42.67ID:milfaijK
快挙ですね。
719デフォルトの名無しさん
垢版 |
2017/11/23(木) 12:04:48.38ID:Le5wB72/
デザインパターンで規定されるいろいろなクラスがあるけど
これらのクラスはそれぞれレイヤー化アーキテクチャのどこに
属すのか知りたい。
たとえばStateパターンがあった場合に、
・<<interface>>State
・ConcreteState x n
・Context
があったとき、

これらは、クラスを配置する場所的に
・プレゼンテーション層(UI層)
・App層
・サービス層
・ビジネスロジック層
・パーシステンス層
のどこの層として配置すればいいのか
2017/11/23(木) 12:18:16.35ID:DeXlBicR
> デザインパターンで規定されるいろいろなクラスがあるけど
> これらのクラスはそれぞれレイヤー化アーキテクチャのどこに
> 属すのか知りたい。

デザパタはレイヤ化アーキテクチャに属すものだという考え方が謎なんだけど
721デフォルトの名無しさん
垢版 |
2017/11/23(木) 12:18:26.01ID:fJlhhdGs
>>719
どの層にも配置していいんじゃね

その層の機能とかを実現するのにそのデザインパターンが必要なら使えばいいのではないか

レイヤーとデザインパターンは独立に組み合わせ可能と思う
2017/11/23(木) 13:43:59.34ID:veVPgurQ
>>719
これでも読めよ

J2EEデザインパターン
https://www.amazon.co.jp/dp/4873111781/
2017/11/25(土) 15:28:17.03ID:unmm6CwQ
java用語発表されてもなー
2017/11/27(月) 07:16:56.92ID:DtvpiAcr
デザパタを適用したクラスがどのレイヤにあっても構わんのじゃ無いか
定石があってもフレームワークごと違うから説明無理だと思う
725デフォルトの名無しさん
垢版 |
2017/11/28(火) 09:02:37.93ID:VA+yl+li
1以上1000以下の整数からなる集合の部分集合で、
その任意の異なる2元 x, y をとったとき、
「x は y を割り切らず、 y も x を割り切らない」
という性質をもつものを考える。

そのような部分集合の中で元の数が最大になるような
集合の元の数を求めよ。
2017/11/28(火) 09:32:48.27ID:EZT/19IX
めっちゃ勘だが、334から666と、667以上の奇数でどうだろうか
727デフォルトの名無しさん
垢版 |
2017/11/28(火) 11:34:19.17ID:VA+yl+li
答えは500以下です。



1 から 1000 までの整数を 2^n * (2*m + 1) の形で表す。

2*m + 1 の部分は、

2*0 + 1, 2*1 + 1, …, 2*499 + 1

の500個のパターンのいずれかに一致する。

よって、1 から 1000 までの整数の中から501個以上の異なる整数を選び出せば、
その中には、かならず、

2^n1 * (2*m + 1), 2^n2 * (2*m + 1)

という二つの整数が含まれる。

この二つの整数は一方が他方を割り切る。
2017/11/28(火) 12:05:52.85ID:TRWRICOE
どっかから問題と回答を拾ってきてドヤ顔してる人ってなんなの?
2017/11/28(火) 14:07:31.97ID:g+QmVGb1
>>727
何をしているのかちゃんと理解したいのですが、
m や n は実数ですか?
2017/11/28(火) 15:55:11.56ID:8wOk3LC1
>>729
>>727が言葉が足りてないのは確かだが、もうちょっと数学のセンス磨こうぜ
2017/11/28(火) 17:12:15.85ID:g+QmVGb1
>>730
n=0 にして、m=0, 1, 2 ...
n=1 にして、m=0, 1, 2 ...
...
とやって確かめたら、なんとなく自然数を網羅できそうなのは確認できました。

ただ、本当に網羅できるのか証明はまだできてません。

これ以上はスレチも甚だしいので、独りで頑張ってみます。

流れぶった切ってすみません。
>>725 さん、どうぞ続けてください。
732デフォルトの名無しさん
垢版 |
2017/11/28(火) 17:15:22.43ID:VA+yl+li
>>729

整数を 2 で割れるだけ割ると 2^n * (2*m + 1) の形になります。

例:

120 = 2^3 * 15 = 2^3 * (2*7 + 1)

この場合、 n = 3, m = 7 です。
733デフォルトの名無しさん
垢版 |
2017/11/28(火) 17:16:45.10ID:VA+yl+li
2^n * 奇数

です。
734デフォルトの名無しさん
垢版 |
2017/11/28(火) 17:26:27.93ID:VA+yl+li
1 = 2^0 * (2*0 + 1)
2 = 2^1 * (2*0 + 1)
3 = 2^0 * (2*1 + 1)



999 = 2^0 * (2*499 + 1)
1000 = 2^3 * (2*62 + 1)

となります。

1, 2, …, 1000 をすべて

2^n * (2*m + 1)

という形に表します。

m は 0 から 499 までの 500 個の整数のどれかになります。

ですので、 1, 2, …, 1000 の中から 501 個以上の整数を取ってきて、それらすべてを

2^n * (2*m + 1)

という形に表すと、

2*m + 1

の部分が同じになるような異なる2つの整数があります。
2*m + 1 の部分は同じで、 2^n の部分が異なります。それら2つの整数は
2^n1 * (2*m + 1), 2^n2 * (2*m + 1) のようにあらわされます。 n1 < n2 と仮定して一般性を失いません。
2^n2 * (2*m + 1) は 2^n1 * (2*m + 1) で割り切れます。 2^n2 * (2*m + 1) ÷ 2^n1 * (2*m + 1) = 2^(n2-n1)
2017/11/28(火) 17:58:11.47ID:8wOk3LC1
500以下なのはわかった。500ある例>>726も見つかった。
で、一般に1からNのとき、何個になるのよ?
736デフォルトの名無しさん
垢版 |
2017/11/28(火) 19:31:53.85ID:VA+yl+li
>>726

{501, 502, …, 1000} でもOKですね。
737デフォルトの名無しさん
垢版 |
2017/11/28(火) 19:37:23.97ID:VA+yl+li
>>735

ceiling(n/2)

ではないでしょうか?
2017/11/28(火) 19:54:30.86ID:8wOk3LC1
あんまり面白くない結果だね
739デフォルトの名無しさん
垢版 |
2017/11/30(木) 18:59:28.31ID:A1E/mSxW
セジウィックとウエインのcourseraのオンライン講義を聴講しています。

java.util.List
java.util.Stack
java.util.Queue

は最低だそうですね。

Best practices: Use our implementations of Stack, Queue, and Bag.

だそうです。
740デフォルトの名無しさん
垢版 |
2017/12/02(土) 11:57:41.11ID:6Ds5e+ud
最近傍探索で、最も近いものが複数個あった場合、どうするのが自然ですか?

また、k近傍探索でも、クエリからk番目に近いものが複数あった場合、どうするのが自然ですか?
741デフォルトの名無しさん
垢版 |
2017/12/02(土) 12:30:23.76ID:LweVlrmz
セジウィックとウエインのcourseraのオンライン講義を聴講しています。

なんかやけに課題が厳しくないですか?
742デフォルトの名無しさん
垢版 |
2017/12/02(土) 13:12:04.17ID:LweVlrmz
セジウィックとウエインのcourseraのオンライン講義Algorithms Part 1のWeek 2の課題、できた人いますか?
2017/12/02(土) 17:04:18.29ID:Rnsbf7Hs
今日のNG ID:LweVlrmz
744デフォルトの名無しさん
垢版 |
2017/12/02(土) 20:12:18.77ID:LweVlrmz
courseraのセジウィックとウエインの講義を聴講している人はいますか?
2017/12/04(月) 13:54:02.89ID:fGqdieY2
>>740
好きなようにするのが自然
746デフォルトの名無しさん
垢版 |
2017/12/05(火) 09:10:03.39ID:bL4Z2L1G
↓この仕様の RandomizedQueue の実装できる人いますか?

http://coursera.cs.princeton.edu/algs4/assignments/queues.html
2017/12/05(火) 09:40:42.14ID:71Ul9rRS
>>746
宿題なら自分でやれ
そうでないなら読むのめんどくさいから要約しろ
2017/12/05(火) 09:45:48.47ID:afEItlvW
松坂君につきスルー推奨
749デフォルトの名無しさん
垢版 |
2017/12/05(火) 12:21:40.49ID:bL4Z2L1G
あ、仕様Memory量の見積を勘違いしていました。

できそうですね。

Item 型のデータを格納する Linked List

Linked List の各要素への参照を格納する Item[] 型の
配列を用意すれば実現できますね。
750デフォルトの名無しさん
垢版 |
2017/12/05(火) 12:25:30.33ID:bL4Z2L1G
あ、でも Item[] 型の配列を ResizingArray で実現したとしても、
常に、Memoryの制限である 48*n + 192 bytes というのを満たすのは
無理ですね。

どうすればいいんですかね?

もう少しだけメモリの制限が緩ければ実現可能ですが。
751デフォルトの名無しさん
垢版 |
2017/12/05(火) 12:30:24.08ID:bL4Z2L1G
Performance requirements.

Your randomized queue implementation must support each randomized queue
operation (besides creating an iterator) in constant amortized time.

That is, any sequence of m randomized queue operations (starting from an empty
queue) must take at most cm steps in the worst case, for some constant c.

↑これと↓を両立させることはできるのでしょうか?

A randomized queue containing n items must use at most 48n + 192 bytes of
memory.
752デフォルトの名無しさん
垢版 |
2017/12/05(火) 13:24:03.96ID:bL4Z2L1G
あ、なんだ

簡単でしたね。

Item[] 型の Resizing Array を使えば、

メモリ使用量 〜 8*n

だから、4倍くらいメモリを無駄に使っても

48*n を超えませんね。
753デフォルトの名無しさん
垢版 |
2017/12/05(火) 13:25:09.16ID:bL4Z2L1G
あ、なんだ

簡単でしたね。

Item[] 型の Resizing Array を使えば、

無駄が全くないときのメモリ使用量 〜 8*n

だから、4倍くらいメモリを無駄に使っても

48*n を超えませんね。
754デフォルトの名無しさん
垢版 |
2017/12/05(火) 13:27:33.45ID:bL4Z2L1G
これから実装しますが、また100点満点中100点になりそうです。
755デフォルトの名無しさん
垢版 |
2017/12/05(火) 13:43:27.58ID:bL4Z2L1G
あ、やっぱりだめですね。

dequeue の計算量がネックになりますね。
756デフォルトの名無しさん
垢版 |
2017/12/05(火) 13:45:25.54ID:bL4Z2L1G
あ、分かりました。
一様ランダムに選択された a[i] に a[N] を移せばいいんですね。
2017/12/05(火) 16:58:02.34ID:Z65eXqg0
本日のNGID:bL4Z2L1G
758デフォルトの名無しさん
垢版 |
2017/12/05(火) 21:20:28.14ID:YaGuI/6t
経路探査でray cast algorithmというのがあるらしいんだが、わかりやすいサイトない?
759遊園
垢版 |
2017/12/07(木) 01:30:59.64ID:AoT+leNM
おちんちん に ベロが届くアルゴリズムを教えて下さい。
2017/12/07(木) 09:29:15.88ID:lQf/9LHk
お金が儲かるアルゴリズムを教えてください
761デフォルトの名無しさん
垢版 |
2017/12/08(金) 13:48:57.43ID:6WtIjESa
>>759
ム板らしく

香川大
https://www.youtube.com/watch?v=J_R7fgo0FLc
早稲田大
http://www.takanishi.mech.waseda.ac.jp/top/research/voice/movie/Tongue_Phoneme_s.mpg
http://www.takanishi.mech.waseda.ac.jp/top/research/voice/movie/Tongue_EMA_s.mpg
http://www.takanishi.mech.waseda.ac.jp/top/research/voice/index_j.htm
購入可能
https://auctions.yahoo.co.jp/seller/obaba1212
2017/12/09(土) 02:58:56.19ID:ouHX+Izy
>>760
「お金が儲かるアルゴリズム」で儲かる方法を書いた本を売る
2017/12/09(土) 09:08:05.27ID:hr/9uBAF
子供の言い返しみたい
2017/12/09(土) 12:25:33.81ID:GX7M220U
それは結構知能が高い子供だなw
2017/12/09(土) 16:48:02.91ID:oqulgHhz
https://www.amazon.co.jp/dp/4040800044/ref=cm_sw_r_cp_awdb_c_Kt5kAbQR1S9HF

似たタイトルの本あるな
2017/12/19(火) 17:58:55.99ID:E2JharMg
関数型言語ってUML使うんですか?
クラス図とかメソッドどう書くんだろうと
767デフォルトの名無しさん
垢版 |
2017/12/24(日) 12:09:02.25ID:croU9pw3
ちょっと質問させてください。
状況: トータル1000行くらいある巨大メソッドの改修
言語; PHPだがどの言語でもそう関係のない内容

・まずコントローラのアクションメソッドがあって

public function action(引数){

/* 500行くらいの既存コード */

/*今回改修を加えたい50行位のコード */

/* 500行位の既存コード */
}
となっている。
768デフォルトの名無しさん
垢版 |
2017/12/24(日) 12:16:40.00ID:croU9pw3
・ここで、改修要件は、中間にある「/* 50行くらいの既存コード */」を
  if文で分岐させて分岐次第で違う処理を入れる。というもの。
  したがって、

public function action(引数){

  /* 500行くらいの既存コード */

  if(条件1){
    /* 新規追加コード */
    if(条件1-1){
      /* 新規追加コード */
    }else{
      /* 既存コード */
    }
  }else if(条件2){
    /* 新規追加コード */
  }else{
    /* 既存コード */
  }

  /* 500行位の既存コード */
}

みたいにひたすら条件分岐して既存コードと新規追加コード
が何回も実行されるようにしたい。
769デフォルトの名無しさん
垢版 |
2017/12/24(日) 12:22:57.90ID:croU9pw3
・ここで、俺は「/* 既存コード */」の中身を知っている必要は
 ないと思った。だから、このコードの詳細を読まずに「func()」
 として「action()メソッド内部」に切り出した。
・外部に切り出したのではなく、内部に切り出したのはその処理が
 他のアクションメソッドでは共有されるような汎用的なものではないだろうと
 判断したのと、そのメソッド内で処理を追いやすいようにというのを
 優先させたため。何より、その処理内で使っている関数内ローカル変数の
 依存性の関係上そうせざるを得ないと思った。

public function action(引数){

  /* 500行くらいの既存コード */

  private function __legacy(){
    /* 50行くらいの既存コード */    
  }

  if(条件1){
    /* 新規追加コード */
    if(条件1-1){
      /* 新規追加コード */
    }else{
      __legacy();
    }
  }else if(条件2){
    /* 新規追加コード */
  }else{
    __legacy();
  }

  /* 500行位の既存コード */
}
770デフォルトの名無しさん
垢版 |
2017/12/24(日) 12:31:59.59ID:croU9pw3
・【訂正】上記で「func()」として切り出したと言っているが、
  「__legacy()」に変更しました。すみません。
・上記のように改修した所、レビューを受けたときに怒られた。
・まず、「この__legacy()の中身ちゃんと読んだ? 把握して書いている?」
 という指摘。
・そして「ここメソッド内だけどどうして関数定義しているの?
 他の人そんなことしてないでしょ。どうして変わったことするの?」
 という指摘。

・まず1つめの指摘に対して異議がある。
 ブラックボックス化しなければ大規模なコードは書けないんじゃない?
 ということが言いたい。ライブラリとかフレームワークの機能も全部
 先に中身をよくよく読んでおかなければ使ってはいけないことになるじゃん。

・2つの指摘に対して、
 「周りの人がやっていること」が正しいとは思えない。
 処理を切り出していないから1000行もある巨大なメソッドになっていて、
 汚いコメントで汚しながら機能追加しまくっているんじゃないのかと。
 ローカル変数を使いまくりの同じ処理を何回も実行するのに
 他に良い手段があるとしたら皆さんに教えて頂きたい。
2017/12/24(日) 13:24:11.47ID:d+M5RyEv
汎用的でない50行のコードをコピペしてるんなら関数化してもインライン化してもどっちもどっちだな
DRYを意識したのかもしれんがKISSが抜けてる
それにブラックボックスが許されるのは有名なライブラリやフレームワークのようなテストにテストを重ね、かつ多くの利用者による実績があるものだけだよ
社内コードなんて大概クソコードだしブラックボックスにしても後で痛い目を見るのは自分や他の開発者
何なら単に今把握するだけじゃなくて、未来の自分や開発者のためにわかりにくいところをコメントで説明書きしてもいいくらいだ

あと関数内関数より無名関数を変数に代入した方がいいんじゃね
そもそも新規追加したif文も詳細はわからないがデータよりもロジックに寄っててわかりにくそうな匂いがプンプンする

それに上司には理由を聞かれてるんだから同じローカル変数に別の値を入れて使い回すことの危険性、関数化による参照透明の確保や保守性、メンテナンス性の向上を論理的に答えればいいだけ
772デフォルトの名無しさん
垢版 |
2017/12/24(日) 13:31:29.00ID:ZUclbhk1
>>770
レビュアーが言ってることを正しいと仮定すれば
・1つ目の指摘は既存のコードがカプセル化されてないからだ
・2つ目の指摘はリファクタリングするだけの時間やお金や技術がないからだ
という前提が必要になるから、まあそういうことなんじゃなかろうかと

残念なコードっていうのはあるからね
それを修正する費用と修正して得られる効果を比較対照して
これだけの効果があるんだからこうするべきだと提案をまとめて
説得するのがいいのだろうけど、技術に理解のある人がいないとなかなか難しいね

レビュアーの立場で考えると以下の作業があるんじゃないかと
・改修要件を満たす改修
・既存のコードをカプセル化する
・リファクタリングする

レビュアーは既存のコードとの一貫性を維持しつつ
改修要件を満たす最小の改修をやって欲しいのだろうね

たとえ汚らしいコードであってもいままで動いてきた実績があると
変更に対しては既存のコードをできるだけ変えないようにと保守的になるものだよ

レビュアーがそれをきちんと説明できればいんだけど
コードはクソ、レビュアーもクソなんてことはザラにあるんですよこれが
773デフォルトの名無しさん
垢版 |
2017/12/24(日) 13:35:53.06ID:croU9pw3
>>771 なるほど勉強になります。
少し質問したいが、
・「KISSが抜けている」と言うのはどこらへんでしょうか?
・関数内関数と無名関数の変数化の違いがわからないので教えてください。
 (面倒なら調べます。)
・あなたならどう対応する?
・「理由を聞かれてるんだから答えればいいだけ。」
 →多分論理的に説明したら「じゃあもう何も教えないよ。好きにやって」
  が返って来ると思われる。
  そう言われると、必要な情報も来なくなるし聞けなくなる。
774デフォルトの名無しさん
垢版 |
2017/12/24(日) 13:38:47.27ID:croU9pw3
>>772
なるほど、俺自身が「既存コードのカプセル化」と
「改修要件」という概念と「改修要件を最小に満たす」という
ことについて詳しくないことに問題がありそうだね。
ありがとう、ここらへんをキーワードにして調べてみます。
2017/12/24(日) 13:55:23.50ID:d+M5RyEv
>>773
多分もっと細かく汎用的な(publicにできる)関数の集まりに分解して、汎用的でない部分は最小限に出来るんじゃないかなーって思った
実際のコード見てないから予想だけど

関数内関数だとわざわざprivateかけないと外からアクセス出来ちゃうし、元の親関数抜けても子関数が死なない

そもそも上司とあんまり仲良くないの?
論理的にメリットを売り込んだときに感情論で否定されるくらいの関係性だと下っ端プログラマーはしんどいよ?
まぁ俺ならその段階なら折れて普通にコピペして、もっと実績残して仲良くなってから似たような案件のときに改めて売り込むかな
2017/12/24(日) 16:09:59.00ID:RfRGBvGh
ひとつのメソッドに1000行も書かせる会社はまず危ない

アルゴリズムとかそれ以前
777デフォルトの名無しさん
垢版 |
2017/12/24(日) 16:57:23.08ID:croU9pw3
>>775
なるほど、「まるまる関数化」というのが
ちゃんと機能を意識してカプセル化していないってことか。
一応privateは欠けているけど、関数オブジェクトと
関数定義の違いはあまり詳しくないね。そうか、親関数が抜けたとき
子関数が死ぬか否かの違いがあるわけね。
入りたてだから人間関係はいいも悪いもない。
ただ、本来責任ある人はバタバタしていて、経験ある人が自分の意志で
新人のレビューをバラバラに行っている感じ。

>>776
会社がそうさせているというよりはそれぞれの人員が
これまでの追加の仕方を真似て機能追加した結果メソッドがブクブクと太っている
という状況に見える。
メソッド内で各追加機能がコメントで区画されていてそれなら
別関数にすりゃいいのにって思っている。
俺をレビューした人も、別に会社の工程でそうなっているわけでなく、
進捗を見たかったからだと思うが、書き直しを要求してきて困惑している。
ただ彼は業務要件については圧倒的に俺より詳しいから無視すべきではないと
思っている。
2017/12/24(日) 17:21:20.21ID:d+M5RyEv
>>777
カプセル化はオブジェクト指向において関連するものをまとめる作業だから、ちょっと違うかな?
どちらかというと今回の話は関数型プログラミングの考え方に近い
まぁぶっちゃけ職場のコードなんて割り切らんとやってけんよ
出世してコーディングスタイルに口を出せるようになる日を待つしかない
2017/12/24(日) 18:02:16.50ID:ZlmBMffH
>>777
そんな仕事を放置する会社、と言うことだ
780デフォルトの名無しさん
垢版 |
2017/12/26(火) 20:02:37.53ID:IVX+3dWv
名前だらけのコードってどうやって解読すればいいんだ?
変数化するとそのデータの型が何なのか物量的にどれだけの
規模が格納されているかが見えない。
もちろんログに吐けば見えるが、吐き出さなければパッと見で
何をどう処理しているのか分からない。
2017/12/26(火) 22:58:59.01ID:SjDDNmHA
俺は君の話が見えない
2017/12/27(水) 07:26:44.87ID:uxDwhrz8
関数型言語の仕様書ってUMLで良いの?

データと振る舞い分離してるからクラス図使って良いのかなと
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況