やっぱり動的言語では安全なソフトは作れない 3

このエントリーをはてなブックマークに追加
1uy
2デフォルトの名無しさん:2011/06/20(月) 01:09:01.53
大都会が2げとじゃ
3デフォルトの名無しさん:2011/06/20(月) 01:11:41.95
このスレは、大都会が占拠したけぇの、
これからこのスレに書き込んだヤツは漏れ無く
大都会都民じゃけぇの。
4デフォルトの名無しさん:2011/06/20(月) 01:26:26.73
いろいろウルサイこという上がいるとき → Java
そこそこ自分できめちゃっていいとき  → Scala
おれおれツール            → groovy
5デフォルトの名無しさん:2011/06/20(月) 01:34:19.34
Java育ちの00年グラマーは、どう風呂敷を広げようが所詮Javaの井戸からは出られないのか。
6デフォルトの名無しさん:2011/06/20(月) 01:39:24.43
カフェイン中毒ですから
7デフォルトの名無しさん:2011/06/20(月) 01:41:46.44
 型云々じゃなく、もっと実行時メタ機能の方向で動的言語は語れないか?
8デフォルトの名無しさん:2011/06/20(月) 01:53:41.94
>>4
もう飽きて面倒くさいとき → BeanShell
9デフォルトの名無しさん:2011/06/20(月) 02:18:06.21
3スレ目とか、意味が分からないよ。
10デフォルトの名無しさん:2011/06/20(月) 07:40:10.15
また不毛なスレか…

言語自体が動的と静的の両方いけるようになりつつあるこのご時世に何やってんの
11デフォルトの名無しさん:2011/06/20(月) 07:43:36.61
結局は人間依存
12デフォルトの名無しさん:2011/06/20(月) 07:52:02.57
>>10
両方できる言語であっても動的型付けで書いた箇所については
柔軟性が得られる代わりに静的な型安全のメリットは得られなくなる
静的と動的がトレードオフの関係であることは従来と変わらないよ
13デフォルトの名無しさん:2011/06/20(月) 08:13:37.88
> 言語自体が動的と静的の両方いけるようになりつつあるこのご時世に何やってんの

動的言語は静的いけませんw
14デフォルトの名無しさん:2011/06/20(月) 08:33:13.54
>>13
動的言語で安全なプログラムが組めるPGは
静的/動的両方使える言語でも安全に組める

一方、動的言語じゃ安全なプログラムを組めない
Java土方には使いこなせない

それだけの話
15デフォルトの名無しさん:2011/06/20(月) 08:47:39.14
>>13
「動的な機能を持つ言語」が常に動的に実行されるとは限らない。
「全部でなくてもいいのなら」静的に整合性チェックをすることは可能だ。
16デフォルトの名無しさん:2011/06/20(月) 09:12:51.79
全体の安全性を語ってるのに個人の資質に還元しようとする。
頭悪いの?
17デフォルトの名無しさん:2011/06/20(月) 09:18:08.98
>>16
全体の安全性って何?
一部のPG(Java土方)が低能すぎて動的言語で
安全なプログラムを組めないのは事実だとしても、
それをスレタイのような一般論に拡張すんなよ
18デフォルトの名無しさん:2011/06/20(月) 09:28:03.26
動的言語が広まった理由の一つには、自動テストがしやすいからって側面がある。

そもそも「静的チェックで全体の整合性をチェックできる」ってのが幻想なんだよ。
ビルドエラーだけで全ての問題が解決できるならテストは不要なはずだろ?

実際には静的動的の両方で自動や手動のテストを行うわけだ。

この部分で動的言語は静的言語に比べて良い仕事をする。

CやC++ではABIが弱すぎてテストの自動化で不利だし、
Javaではリフレクション周りのコードがかったるくて重量級のフレームワークの出番になる。
たとえば、import不可のinterfaceをコールバック引数に持つメソッドの呼び出しとかな。

これが動的言語だと、
「モジュールを公開するときはテストコードもセットにするのが当然」という状態になっている。
perlですらそうだ。 http://gihyo.jp/dev/feature/01/test-perl
19デフォルトの名無しさん:2011/06/20(月) 10:17:12.39
言語の規格や各処理系の実装や開発者層の問題ばかりで
動的・静的であること自体に起因する問題が皆無
20デフォルトの名無しさん:2011/06/20(月) 10:26:51.25
各種言語が静的に回帰してるのに何言ってんだ
21デフォルトの名無しさん:2011/06/20(月) 10:27:50.30
静的型付けと動的型付けはトレードオフで
メリットがデメリットを上回るなら動的言語を使えば良い
安全性もテストで確保出来る

たったこれだけのことなのに、Java土方が「Java以外認めん!」
って鼻息荒くしてるだけだろ
22デフォルトの名無しさん:2011/06/20(月) 10:39:55.59
大規模開発じゃデメリットが顕著って話なのに
23デフォルトの名無しさん:2011/06/20(月) 10:53:27.03
大規模開発の問題点ってコードの整合性よりデータの整合性の方が大きいだろ?

データに関して言えば、SQL自体が動的言語だからなwwww
コードに関して言えば、動的言語を使うと規模を大幅に縮小できるケースもある。
24デフォルトの名無しさん:2011/06/20(月) 10:54:45.32
ちなみに俺がみた土型コードはこんなだった。

O/Rマッパーのためにデータクラスを書き
Beanのためにデータクラスを書き
MVCのためにデータクラスを書いていた。

全部同じデータなのに。
設計した奴死ねよ
25デフォルトの名無しさん:2011/06/20(月) 10:55:03.02
ほんとに静的型言語らしいご利益があるのってMLとかHaskellぐらい。
Java程度ならCとたいして変わらん。
26デフォルトの名無しさん:2011/06/20(月) 11:13:33.69
MLとかがバグが出にくいのは副作用が無い/少ないから。
だからユニットテストが機能しまくる。
27デフォルトの名無しさん:2011/06/20(月) 11:16:55.07
動的言語でも副作用のある関数に!付けたりして
区別するようにしてるとバグが出にくい。
28デフォルトの名無しさん:2011/06/20(月) 11:18:21.26
>>22
文章に"土方しか集まらないから"が抜けてますよ?
29uy ◆yyC0rYWEq2 :2011/06/20(月) 15:48:45.30
ひじかたわきすぎ


動的言語だと、行数小さくなるから

 JAVA(笑)で作った物と比べて格段に小さくなって
 JAVA(笑)でかかれたら大規模に見えても
  動的言語(神)かかれたそれは大規模とみなされないことってあると思う
 JAVA(笑)だと動的言語では本来かかなくてもいいコード沢山かいているとおもうし

そもそも
 JAVA(笑)はひじかた言語でしょ?
 ひじかたを効率よく使う為に、三マイクロ社が作った奴隷用言語でしょ?
 趣味でJAVA(笑)やってる奴なんて・・・?


 ???
30デフォルトの名無しさん:2011/06/20(月) 16:01:27.96
作った奴等がLisp無双だったんで、その反動から一周遅れぐらいでC言語っぽく
なったのがJava。ポストCobolみたいになったのはたまたまのなりゆきだろう。
31デフォルトの名無しさん:2011/06/20(月) 16:37:33.29
GoslingはLisperじゃないと思うが

それにJavaは明らかにポストC++を狙ってたと思う
C/C++に似てるのは偶然じゃない
32デフォルトの名無しさん:2011/06/20(月) 16:50:11.74
見たことないから知らないんだけど、
Gosling EmacsのMock LispはLispではなかったのだろうか。
33デフォルトの名無しさん:2011/06/20(月) 16:51:59.06
調べてみたら確かにLispではなかったようだ。
Mockだしな…
34デフォルトの名無しさん:2011/06/20(月) 17:04:57.97
しかも実装はCだしな
もうEmacs使うのやめようぜとか言ったり、
あんまりLisp好きじゃ無い印象
35デフォルトの名無しさん:2011/06/20(月) 17:21:44.38
>>29
そこでなぜ、C#やC++と比べ無いのだろう。。。。
36デフォルトの名無しさん:2011/06/21(火) 01:04:40.49
動と静をあわせ持った言語って無いの?
37デフォルトの名無しさん:2011/06/21(火) 01:05:27.77
C#はそうじゃね?
38デフォルトの名無しさん:2011/06/21(火) 01:15:38.94
C++
39uy ◆yyC0rYWEq2 :2011/06/21(火) 06:10:16.62
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
JAVAはks
40デフォルトの名無しさん:2011/06/21(火) 21:13:02.27
結論はいつも、C#最強
41デフォルトの名無しさん:2011/06/21(火) 21:19:06.50
そうなんだよね
.NETってものがあるのに、JAVAがそれ無視して突っ走る理由が意味不明
素直に負けを認めて消えろよJAVA
たとえ自分たちがどれだけ先進したもの作ったとて、
この世界では一瞬で真似されるんだから、「商売」が成り立ってること事態奇跡であって
マジでレベルの高い奴らに目を付けられていない瞬間にしか儲けられない、とても運のいいことなんだよ
.NETを触る新言語を作るならまだしも、それ以外はもういいです
古い概念をいつまでも大事にしているJAVAは消えてほしい
42デフォルトの名無しさん:2011/06/21(火) 22:36:14.74
JavaVMは、CLRとまだまだ対抗できる。
Java vs C#の勝負はついた。
43デフォルトの名無しさん:2011/06/21(火) 23:15:10.03
>>36
> 動と静をあわせ持った言語って無いの?

それは静とみなされるw
44デフォルトの名無しさん:2011/06/21(火) 23:18:12.75
動的言語なら静的言語の半分以下の量でコーディングできるって
豪語していたやつがいたから、

じゃあ、なんで半分の時間でできないの?
給料も半分でいいよね?って聞いたら
ブチ切られたw
45デフォルトの名無しさん:2011/06/22(水) 01:35:30.91
ああ、書いた行数で金を貰ってるのか。
理解できた。
46デフォルトの名無しさん:2011/06/22(水) 02:59:23.46
書いた行数が短いから動的言語は有利と
言ってるやつがいるからバカにされてるだけだよw
47uy ◆yyC0rYWEq2 :2011/06/22(水) 04:36:49.28
ただでさえ巨大なプログラムに
やたら複数行に渡ったコメントかいてるソース多いからな
ソースコードの中に含めなくても良いデータや、
そのプロジェクト内のライブラリフォルダを作るべきようなものまで散らかってると殺意覚える
読みにくいから行数を減らす努力しろと
関数の手前にかかれたコメント読んだ所で、結局「わかった気」になるだけで
本当にソース理解する為にはコメントではなくソースを読まなければならない
それかせめて別拡張子のソースコードにするとかさ
未だに行数気にしてる奴多いだろ
10万超えのソースコードってソース読んでると大抵、肥大している原因はコメント量と
外部ファイルにしておくべきデータをソース内に入れてることにある
俺は10万行もかいてるぜ(キリッ) ですかあ?
ぼくはウィンドウシステムからテキストエディタ作ってもそこの実装部分300行程度しかないよ
SHIFT,CONTROL,END,HOME,BACKSPACE,SPACE,DELETE,PAGEUP,PAGEDOWN,大文字小文字,各種,記号入力も対応させてその程度
静的言語でやったら10倍に膨れ上がると思う

実際、動的言語でかいたらソースコード量は半分どころの削減ではなく
静的言語と違ってリファクタリングしていけば無限に縮まるから( メタまでやっていいなら限界なし )
どの程度まで「動的にコードを生成」やっていいのかによる
48デフォルトの名無しさん:2011/06/22(水) 07:13:21.00
などと、長いプログラムが読めないバカが申しており
49デフォルトの名無しさん:2011/06/22(水) 08:47:59.96
perlとかPOD前提の言語をdisってるとしか思えない
50デフォルトの名無しさん:2011/06/22(水) 08:56:28.75
>>44
Java土方に比べたら時間も半分どころじゃないと思う
ていうか、Java土方ってまともにプログラミングできるの?www
51uy ◆yyC0rYWEq2 :2011/06/22(水) 10:36:04.24
>>48
残念ながら客観的にみても長いプログラムかくほうがバカっすよ・・・
短くしないほうがかくのは簡単だからねぇ

Aクラス、Bクラス、Cクラスとあって、それぞれの共通データがあるとき
君たちゴミは一階層上にDクラスを作るんだと思うけど、

これはリファクタリングした場合、ひとつのクラスにすることが出来る
そうするとクラス数は4分の1、ソースコード量は、A〜Cのクラスを1つにまとめた時点で最低でも3分の1にはなってる

この手のリファクタリングは大変だから静的言語じゃまずやんねーよ
それぞれの引数の型や戻り値とか色々変えなきゃならなくなるんだから
流石に面倒くさいを通り越して効率が悪い
52デフォルトの名無しさん:2011/06/22(水) 10:43:52.04
javaコードをscalaコードにしたら1/3ぐらいは余裕なんで
動的な言語のほうがが静的な言語よりコード量が云々っていう意見が無くなる未来がそのうちくるかもね
まあこなそうだけど
53デフォルトの名無しさん:2011/06/22(水) 10:51:30.30
scalaは別にダックタイピングはサポートしてないからな。
関数オブジェクトがあるのと、型の生成と推論がしやすいだけで。
54デフォルトの名無しさん:2011/06/22(水) 11:00:39.46
だからコード量が短くて済むってことはプログラミングの粒度が粗いってことだと何度(r
55デフォルトの名無しさん:2011/06/22(水) 11:10:21.07
>>54
正規表現で一発ってコードとちまちま文字列操作してるコードは粒度おんなじ。
56デフォルトの名無しさん:2011/06/22(水) 11:32:28.10
scalaはStructural Subtypingっていう静的ダックタイピングみたいな機能あるけど全然使われてない
C#のusingマネるコードでしか見たことないな
57uy ◆yyC0rYWEq2 :2011/06/22(水) 13:14:55.91
>>54
ハッアアアwWw??www???
自分が冗長なコードかいてることに、
そういう見苦しい良いわけ言うのやめろよ・・・・・
おまえみたいなゴミが何をいったところで動的言語よりもコード量が増えるっつうのは静的言語の負けてる部分だってのに
それを・・・・・・・wwwwwwwwwwwwwwwww


58デフォルトの名無しさん:2011/06/22(水) 14:08:32.26
粒度が粗いってことはファンクション単位のスニペットの流用がやり辛いってことなんだよん
大味なアプリケーションしか書けない&動作が緩慢で小回りがきかない巨像。それが動的言語の正体。
59デフォルトの名無しさん:2011/06/22(水) 14:15:41.26
コード無しだと水掛け論だね

ま、簡単なところで、一昨日Pythonスレで何故か盛り上がった
辞書の辞書にリスト入れるケースがどれくらい書き易いか
やってみたら?
ttp://hibari.2ch.net/test/read.cgi/tech/1305217361/287
60デフォルトの名無しさん:2011/06/22(水) 14:26:32.67
# Python
from collections import defaultdict
hash = defaultdict(lambda: defaultdict(list))
hash['a']['b'].append('111')

# Ruby
hash = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}
hash['a']['b'].push('111')

# Perl
push(@{$list{'a'}{'b'}}, '111')
61デフォルトの名無しさん:2011/06/22(水) 15:37:14.19
なんだ、Perl最強じゃん
他は冗長だからカス
62デフォルトの名無しさん:2011/06/22(水) 16:20:11.46
>>56
型の構造同値、なぜか流行らないよな。
Modula-3,Ocamlでもそうだった。
なぜだろ?
63デフォルトの名無しさん:2011/06/22(水) 16:28:24.74
ダックタイピングはコード短くなるしお手軽だけど、効率に目をつぶり、問題をテストに押し付けてるだけ。
64デフォルトの名無しさん:2011/06/22(水) 16:38:46.07
>>59
// Java

import java.util.*;
class Foo
{
    public static void main(String args[])
    {
        HashMap<String,HashMap<String,LinkedList<String>>> hash =
            new HashMap<String,HashMap<String,LinkedList<String>>>();
        HashMap<String,LinkedList<String>> h;
        if (hash.containsKey("a") && hash.get("a") != null) {
            h = hash.get("a");
        } else {
            h = new HashMap<String,LinkedList<String>>();
            hash.put("a", h);
        }
        if (h.containsKey("b") && h.get("b") != null) {
            h.get("b").add("111");
        } else {
            String[] s = {"111"};
            h.put("b", new LinkedList<String>(Arrays.asList(s)));
        }
    }
}
65デフォルトの名無しさん:2011/06/22(水) 17:53:58.40
>>63
そのテストを用意するのが動的言語では効率いいからな。
静的言語ならテスト不要になるわけでもない。

>>64
>hash.containsKey("a") && hash.get("a") != null
これは単に冗長。 hash.get("a") != null だけでいい
ほかにもわざとやってるんじゃないかと思うくらい冗長に書いてある。
66デフォルトの名無しさん:2011/06/22(水) 18:05:23.43
import java.util.*;

public class Test1 {
 void foo(String k1,String k2,String v){
  HashMap<String,HashMap<String,List<String>>> mm = new HashMap<String,HashMap<String,List<String>>>();
  HashMap<String,List<String>> m = mm.get(k1);
  if(m==null) mm.put( k1, m = new HashMap<String,List<String>>() );
  List<String> l = m.get(k2);
  if(l==null) m.put( k2, l = new ArrayList<String>() );
  l.add(v);
 }
}

せいぜいこんなとこか。
でも Autovivification の有無って静的動的関係なくね?
67デフォルトの名無しさん:2011/06/22(水) 18:07:57.16
JSONObject でも使っていいならもっと減るな。
68デフォルトの名無しさん:2011/06/22(水) 18:14:45.57
haskellやscalaのコードも見たいな
誰か書ける人居ない?
69デフォルトの名無しさん:2011/06/22(水) 18:27:41.70
class MyHashMap<K,V> extends HashMap<K,V>
{
    public V get(K key, V value) {
        if (get(key) != null) {
            return get(key);
        } else {
            put(key, value);
            return value;
        }
    }
}

みたいなクラスを用意しとけば2行になったよ

MyHashMap<String,MyHashMap<String,List<String>>> hash = new MyHashMap<String,MyHashMap<String,List<String>>>();
hash.get(k1, new MyHashMap<String,List<String>>()).get(k2, new ArrayList<String>()).add(v);

総称型で V v = new V(); が出来れば
hash.get(k1).get(k2).add(v);
って書けるようになるんだけど
70デフォルトの名無しさん:2011/06/22(水) 18:34:46.80
>>69 のコードは必要ない場合までnewしてていくらなんでもNGだろう。

静的型チェックを維持したままやるなら、
ruby のコードみたいに、デフォルトの値を設定するコールバックを用意するのがスジ。
71デフォルトの名無しさん:2011/06/22(水) 18:38:13.63
てーかScalaの例がみたい。
implicit def でvivification対応のメソッドも後付できるし、
デフォルトの値を設定するコールバックを指定/記述する部分も簡潔にいけそう
72デフォルトの名無しさん:2011/06/22(水) 18:39:22.01
>>70
もっと短くなるね。
73デフォルトの名無しさん:2011/06/22(水) 18:41:46.83
>>72
Javaだとコールバックの記述が無名クラスだから、どうしても冗長になるよな…
finalつけないと値を覚えてくれないとかも正直ぎこちない。
74デフォルトの名無しさん:2011/06/22(水) 18:45:11.47
コールバックバージョンぷりーず
75デフォルトの名無しさん:2011/06/22(水) 19:13:38.60
>>72 じゃないけど、
派生型がアリならこんなとこか
Scalaなら派生型ナシでもっと短く書けるし、静的言語ならどうという例には向いてないんじゃないかコレ

import java.util.*;

public class Test1 {
 abstract class MapBase<K,V> extends HashMap<K,V> {
  abstract V make();
  V prepare(K k){
   V v = get(k);
   if( v== null ) put(k,v = make());
   return v;
  }
 }
 class M extends MapBase<String,List<String>>{
  @Override List<String> make() { return new ArrayList<String>(); }
 }
 class MM extends MapBase<String,M>{
  @Override M make() { return new M(); }
 }
 void foo(){
  new MM().prepare("a").prepare("b").add("111");
 }
}
76デフォルトの名無しさん:2011/06/22(水) 19:29:19.35
静的言語の特徴はともかく、Javaの特徴はでてる
77デフォルトの名無しさん:2011/06/22(水) 19:33:17.88
>>60
Ruby や Perl の push と Python の append て同じような動作なの?
push はリストの先頭に、append はリストの最後に加えるイメージ。
そのどれも詳しくないけど。
78デフォルトの名無しさん:2011/06/22(水) 19:38:08.19
scalaでなんも考えずにやるとこんな感じか

import scala.collection.mutable.{Map, Buffer}
val hash = Map[String,Map[String, Buffer[Int]]]()
hash.getOrElseUpdate("a", Map()).getOrElseUpdate("b", Buffer()) += 111
79デフォルトの名無しさん:2011/06/22(水) 19:40:11.85
>>77
全部末尾に追加
80デフォルトの名無しさん:2011/06/22(水) 20:36:56.95
元ネタは2タプルがキーの辞書みたいだね、そっちでいいならそっちのが簡単だ

import scala.collection.mutable.{Map, Buffer}
val hash = Map[(String,String), Buffer[Int]]()
hash.getOrElseUpdate(("a","c"), Buffer()) += 111
81デフォルトの名無しさん:2011/06/22(水) 20:57:59.16
>>75
M と MM が最高にダサイ
82デフォルトの名無しさん:2011/06/22(水) 21:51:21.14
>>77
Perlのpush/popは末尾、unshift/shiftが先頭
83デフォルトの名無しさん:2011/06/22(水) 23:13:18.56
Javaはコードを書くと同時に
テストコードを書いてると思えばいい。
あの長さにはテストコードが含まれてる。

動的言語で同等のテストコードを書いてみ。
Javaと同じで型チェック程度でいいからさ。

そうすると、動的言語も静的言語も
違いはなくなる。
84デフォルトの名無しさん:2011/06/22(水) 23:14:49.87
つーか他人のPerlのコードなんて読めないじゃん
85デフォルトの名無しさん:2011/06/22(水) 23:47:58.07
>>83
意味不明というかただの妄想に聞こえる
86デフォルトの名無しさん:2011/06/22(水) 23:59:34.80
>>83
>>66のfoo()をPython2.7で型チェック含めて書いてみた

from collections import defaultdict
from anntools.validation import *
@validate(k1=Str, k2=Str, v=Str)
def foo(k1, k2, v):
    hash = defaultdict(lambda: defaultdict(list))
    hash[k1][k2].append(v)

foo('a', 'b', '111')
foo('a', 'b', 111) # Error!
87デフォルトの名無しさん:2011/06/23(木) 00:04:51.46
>>78>>69と違って必要無いときは
getOrElseUpdate()の引数のMap()やBuffer()は実行されないんだよね?
Scalaいいね
88デフォルトの名無しさん:2011/06/23(木) 00:48:17.67
うんgetOrElseUpdateの第2引数はcall-by-name(名前渡し)
89デフォルトの名無しさん:2011/06/23(木) 03:38:58.34
>>85
意味不明じゃないよ。

型をしっかり書くということは
エラーチェックになっている。
それらの型以外が入らないわけだから。

動的言語でそれをやったところで、実行時にしかわからないわけだから
片手落ちにしかならないが、それでも型チェックを
加えてみって話。
90デフォルトの名無しさん:2011/06/23(木) 05:01:20.63
むしろ「あれだけの長さのコードを書いて型チェックしかできない」のが問題なんだろう
91デフォルトの名無しさん:2011/06/23(木) 05:03:11.30
Slacaの例とJavaの例を比較して、Javaの例が有利なポイントはゼロ。
なので >>89 の論旨はおかしい
92デフォルトの名無しさん:2011/06/23(木) 05:05:31.89
Scala のタイプミス
93デフォルトの名無しさん:2011/06/23(木) 05:54:09.50
短い例では動的言語が短くかけるけど、
通常のアプリのような
それなりの規模のものは、
動的言語で書いても全然短くならないんだよな。
なんでだろ?
94デフォルトの名無しさん:2011/06/23(木) 06:07:15.54
短く書けるのは想定の範囲内だけ
95デフォルトの名無しさん:2011/06/23(木) 06:11:23.29
>>93
そりゃ君が動的言語に向いた設計をできてないからだろ
96デフォルトの名無しさん:2011/06/23(木) 06:13:44.94
動的言語に向いているのは短いプログラムだけだろ
97デフォルトの名無しさん:2011/06/23(木) 06:16:00.48
反例がいくらでもあるが、
その前に「短いプログラム」じゃないのはどの程度の規模になるのか尋ねておこうか
98デフォルトの名無しさん:2011/06/23(木) 06:30:11.52
動的言語が向いているのは
静的言語がIDE立ち上げてプロジェクト作るのに
かかる時間内に書ける程度までだろ
99デフォルトの名無しさん:2011/06/23(木) 06:45:16.29
>>98
gmailのブラウザ側スクリプトすら書けなさそうだ、君には
100デフォルトの名無しさん:2011/06/23(木) 06:52:34.91
ブラウザスクリプトも静的言語の方が向いているよ
今はJavaScriptしかのってないから仕方なく動的言語使っているってだけで
101デフォルトの名無しさん:2011/06/23(木) 06:54:18.04
「動的言語で書いても全然短くならない」と
「ブラウザスクリプトも静的言語の方が向いている」は全然別のことを言ってるんだが、分かってるのかな
102デフォルトの名無しさん:2011/06/23(木) 06:55:47.45
インタプリタなら動的言語の方が実装が簡単。
103デフォルトの名無しさん:2011/06/23(木) 06:55:58.04
>>101
全然別の話題を唐突に語りだしたのはおまえだよ、馬鹿
104デフォルトの名無しさん:2011/06/23(木) 07:24:32.98
規模の大きなコードの例だろ? なにが全然別なんだよ
105デフォルトの名無しさん:2011/06/23(木) 07:26:18.86
まだいたのか、この馬鹿
106デフォルトの名無しさん:2011/06/23(木) 07:40:05.65
え、動的言語使ってもJavaより短く書けないの?
どんだけ低能なんだよwww
ふつーのPGならJavaよりは圧倒的に短くなるよ?
107デフォルトの名無しさん:2011/06/23(木) 07:40:56.52
てーか設計が静的言語と同じなら静的言語と同じ程度の構成にしかならんわな。
コーディングの問題じゃないよ。
108デフォルトの名無しさん:2011/06/23(木) 07:41:18.32
>>102
あれ現在最もインタープリタやコンパイラなどの言語処理を簡単にかけるのはMLとかの
静的言語だと思うけど。
109デフォルトの名無しさん:2011/06/23(木) 07:42:37.83
>>108
コンパイラは静的言語の方が簡単。
110デフォルトの名無しさん:2011/06/23(木) 07:42:39.56
もっとも簡単に書けるのはBrainf*ck
111デフォルトの名無しさん:2011/06/23(木) 07:44:29.44
>>100
GoogleやTwitterはJavascript直接書いたりなんかしない。
静的ツールを使って自動生成しているよ。
112デフォルトの名無しさん:2011/06/23(木) 07:48:45.34
大抵のコンパイラ/インタプリタは
C/C++を除けばその言語自身で書かれてることが多い
113デフォルトの名無しさん:2011/06/23(木) 07:50:14.79
動的言語が使えるのは一回きりの使い捨てスクリプトのみだな。

動的言語では人間が書かなければならないテストが膨大になってしまう。
静的言語ではケアレスミスはだいたい型チェッカがとってくれて、人間は
本当に大切なアプリケーションロジックを中心にテストできる。
これは重要だと思う。
114デフォルトの名無しさん:2011/06/23(木) 07:56:40.84
このスレには動的言語でテスト書いてる人ってどのくらいいるんだろう
動的言語のテストってのはこういうもんだ!って
具体的な話になっているのをPart1から3までで見たことが無い
115デフォルトの名無しさん:2011/06/23(木) 08:03:25.28
型チェックとか範囲指定とかは必要なら>>86みたいに書いてるよ俺は
あとはPythonに付いてる標準のunittest使ってるわ
116デフォルトの名無しさん:2011/06/23(木) 08:03:56.91
こういうもんだ、って話なら実際に見た方が早いな。
http://cpansearch.perl.org/src/TIMB/DBI-1.616/t/
117デフォルトの名無しさん:2011/06/23(木) 08:04:59.93
LLVMを使った静的スクリプト言語がブラウザに載るとき、
デスクトップアプリとWebブラウザアプリの性能差がなくなる。
むしろJVMなんか使ったものより快適になるのでは
118デフォルトの名無しさん:2011/06/23(木) 08:06:35.32
>>114
テストをちゃんとすると動的言語の方がより膨大なコード量になってしまうし、
拡張や変更のコストも大きくなってしまう。
テストをちゃんと考えるべきシステムは動的言語から静的言語へ移ってきてるよ。
119デフォルトの名無しさん:2011/06/23(木) 08:06:41.85
>>115
動的言語は型チェックってすることが多くないからなあ
むしろインタフェースに重点を置いて
引数はreadってメソッド持ってる?って調べることが多い

テスト文化の先端を行くRuby使いはいませんか
120デフォルトの名無しさん:2011/06/23(木) 08:07:03.23
>>86
これ書くくらいなら
静的言語使ったほうがいいような
121デフォルトの名無しさん:2011/06/23(木) 08:14:54.12
>>120
本当に必要なとこだけ書くんだよ
あとデコレータ駆使すれば型以外にも様々なチェックが
短いコードで出来る
122デフォルトの名無しさん:2011/06/23(木) 08:16:28.48
そもそも安全なソフトなんていらないの
クラッシュしたら修正して再起動すればいい
123デフォルトの名無しさん:2011/06/23(木) 08:18:32.21
>>121
本当に必要なとこってどうやって決めるの?
判断ミスしたりしないの?
124デフォルトの名無しさん:2011/06/23(木) 08:30:42.16
>>121
そんなんだから動的言語は信頼性が低いとかバグが多いとか言われるんだよ。
動的言語でWebサイト作ってインターフェイスのバグによって決済が行われず、
訴訟問題に発生した例も知ってる。
バグの原因はメソッド名のタイポだぜ、あほらしい。
125デフォルトの名無しさん:2011/06/23(木) 08:36:43.35
だからテストが要る
動的/静的型付け言語どちらであっても、真面目にテストを書いたら
コード全体の半分以上はテストになってしまう
実際グーグルのソースコードはそんな感じらしいが……
126デフォルトの名無しさん:2011/06/23(木) 08:38:47.13
>>123
公開してるインターフェースでかつ
総称的な振る舞いが期待されない関数だけに
チェック付けてるな

判断誤りの可能性はあるが、俺は問題になったこと無い
127デフォルトの名無しさん:2011/06/23(木) 08:39:28.47
>>124
お前のようなアホはSQLインジェクションで氏ね
128デフォルトの名無しさん:2011/06/23(木) 08:42:03.89
>>124
ちょっとしたコード書くだけで>>75みたいになる言語じゃ
テストなんて面倒くさすぎるのかもしれんが
同じコードが動的言語だと>>60だからね
そりゃテスト書いてもおつりが来るよ
129デフォルトの名無しさん:2011/06/23(木) 08:42:39.92
pythonってインターフェースを非公開にできたっけか?
130デフォルトの名無しさん:2011/06/23(木) 08:43:48.48
>>129
_プレフィックス付きは非公開という暗黙の了解が
131デフォルトの名無しさん:2011/06/23(木) 08:48:00.90
>>128
テスト書いてみてよ
132デフォルトの名無しさん:2011/06/23(木) 09:07:46.44
>>131
本当はtest()にずらずら書くけど、それは長くなるから


import unittest
from collections import defaultdict
from anntools.validation import *

@validate(k1=Str, k2=Str, v=Str)
def foo(k1, k2, v):
    hash = defaultdict(lambda: defaultdict(list))
    hash[k1][k2].append(v)

class TestFoo(unittest.TestCase):
    def test(self):
        foo('a', 'b', '111')
        self.assertRaises(ValidationError, foo, 'a', 'b', 111)
        self.assertRaises(ValidationError, foo, 0, 'b', '111')
        self.assertRaises(ValidationError, foo, 'a', 0, '111')

if __name__ == '__main__':
    unittest.main()
133132:2011/06/23(木) 09:14:13.56
このテストって動的言語の利点ゼロだけど、お題があれだから……
134デフォルトの名無しさん:2011/06/23(木) 09:35:19.54
テストが増えたら動的言語のいいところがなくなる。
VB6がクソミソに言われながらも、実用場面で広範囲にわたって使われたのも皮肉。
135デフォルトの名無しさん:2011/06/23(木) 09:58:29.78
C++

#include <map>
#include <string>
#include <vector>
int main() {
using namespace std;
map<string,map<string,vector<string> > > h;
h["a"]["b"].push_back("111");
}
136デフォルトの名無しさん:2011/06/23(木) 10:06:01.03
C++かわいいよC++
超高速なLLとして使ってるぜ
137デフォルトの名無しさん:2011/06/23(木) 10:10:50.96
>>134
Variant型使いまくりのVB6で静的言語とかただのネタだろ。

静的言語なら常に型チェックを行うわけじゃないんだぜ
138デフォルトの名無しさん:2011/06/23(木) 10:12:00.22
で、静的言語の信者の人はSQLやJSONはどうやってるんですか

データと型が一致しないんじゃ「静的言語だから型チェックは大丈夫」とかただの念仏ですよね
139デフォルトの名無しさん:2011/06/23(木) 10:15:53.17
>>135
じゃあ今度はJavaのようにAutovivificationしないバージョン書いてみて
140デフォルトの名無しさん:2011/06/23(木) 10:20:14.24
>>86
これってコンパイル時にエラーになってくれるの?
141デフォルトの名無しさん:2011/06/23(木) 12:45:41.45
>>137
VB6でVariantはあまり使わない。外部のクラスを扱うときにObjectが多用されるぐらい。VB(COM)にinterfaceあるって失念してる人多いな。
142デフォルトの名無しさん:2011/06/23(木) 13:11:59.34
JSONとか簡単じゃん

boost::property_tree::ptree pt;
read_json("hoge.json", pt);
cout << pt.get<string>("hoge") << endl;
143デフォルトの名無しさん:2011/06/23(木) 13:33:26.82
>>142
データに対する何のチェックもないよねそれ
144デフォルトの名無しさん:2011/06/23(木) 13:38:43.15
チェックしたければすればいいじゃん
145デフォルトの名無しさん:2011/06/23(木) 15:07:32.27
>>144
スレタイ嫁
146デフォルトの名無しさん:2011/06/23(木) 15:12:52.48
>>140
無理
147デフォルトの名無しさん:2011/06/23(木) 16:13:23.54
今のJavaScriptなんか捨ててActionScript3相当を標準にして欲しい。
148デフォルトの名無しさん:2011/06/23(木) 16:21:00.42
むしろブラウザに仮想マシンのっけて好きな言語で開発させれ
149デフォルトの名無しさん:2011/06/23(木) 16:43:35.86
ブラウザのJavascriptでLinux動かして
そのLinux上で好きな言語使いなよ
150デフォルトの名無しさん:2011/06/23(木) 17:23:29.61
phpみたく、他の言語もインストールしたら、サーバ側でhtmlタグ埋め込みで記述出来るようにはして欲しいかな
151デフォルトの名無しさん:2011/06/23(木) 17:40:32.57
ActionScript最強伝説
152デフォルトの名無しさん:2011/06/23(木) 19:52:26.55
>>151
まあ・・・なんだ、あんたも大変だな
153デフォルトの名無しさん:2011/06/23(木) 19:59:31.35
良い言語だけどね、AS3。良い感じでJavaScriptの進化形。
使える場面が限定されすぎるのが残念だ。
154デフォルトの名無しさん:2011/06/23(木) 20:46:22.39
あれならJavaのほうがいい
マジで
155デフォルトの名無しさん:2011/06/23(木) 21:13:15.35
バージョンが上がるほど静的になっていくActionScript
156デフォルトの名無しさん:2011/06/23(木) 21:48:48.98
未だに型宣言しないで動的にも書けるんだけれども静的な書き方の恩恵が
でかすぎてAS3ですっかりJavaチックな書き方が浸透したと思う。
157デフォルトの名無しさん:2011/06/23(木) 21:52:28.02
>>154
Javaチックだけれどもクロージャが書きやすい点は良い > AS3

関数オブジェクトのシグネチャを検証しないのは物足りないし、ジェネリクス
欲しいし、変数が関数スコープとかウンコだけれども。
158デフォルトの名無しさん:2011/06/23(木) 22:08:12.20
なんで短いコードなら動的言語は圧倒的に少ない行数でかけるのに、
普通のプロジェクトでは大差がないのか考えてみた。

1.動的言語は基本的な命令がライブラリをロードしないで使える。
printとかなにもロードしないで実行出来る。だけど実際のプロジェクトでは
他に多くのライブラリを使用するので差がなくなる。

2.動的言語は変数を宣言しないで使える。
だけど実際のプロジェクトではstrictとかwarningをONにするので結局変数宣言している

3.動的言語はクラスを書かなくて良い
だけどある程度大きくなると必然的にクラスを使わないと管理しづらい。
フレームワークを使うとほぼ必然的にクラスを使うことになる。

4.関数を作らない前提の比較だから
短いコードでは基本的に関数を作成しない。実際のプロジェクトでは関数を
作ることで大幅にコードの削減をしているが、短いコードの例ではその利点が生かせない。

こんな所かな?
他にもあったら教えてください。
159デフォルトの名無しさん:2011/06/23(木) 22:08:21.55
クラスベースになったのにクロージャ必要か?
160デフォルトの名無しさん:2011/06/23(木) 22:09:11.35
まず「クラスベース」は目的じゃない。
161デフォルトの名無しさん:2011/06/23(木) 22:10:11.30
は?
162デフォルトの名無しさん:2011/06/23(木) 22:11:28.36
C++でクロージャかいてみればわかるのにな
163デフォルトの名無しさん:2011/06/23(木) 22:18:41.48
C++でクロージャかけないんだが?
かけるのは関数オブジェクト。

クロージャというのなら、クロージャを定義した場所(関数)の
ローカル変数が見える必要がある。
164零細 ◆REISAIxhXo :2011/06/23(木) 22:20:31.22
このスレは、大都会が占拠したけぇの、
これからこのスレに書き込んだヤツは漏れ無く
大都会都民じゃけぇの。
165デフォルトの名無しさん:2011/06/23(木) 22:25:06.03
>>163
ローカルクラスは、staticなローカル変数にアクセスできる。
普通使わんけどな。
166デフォルトの名無しさん:2011/06/23(木) 22:29:13.68
staticだから駄目
167デフォルトの名無しさん:2011/06/23(木) 22:31:15.02
>>112
インタプリタで書かれたインタプリタか、胸熱じゃな。
168デフォルトの名無しさん:2011/06/23(木) 22:31:51.39
JavaScriptやActionScriptの「クロージャ」の恩恵は中から外の環境の変数を
参照できるというクロージャ本来の特徴よりも、単に無名関数をより少ない
記述量で宣言できるという記法的な面の方が大きいと思う。
(functionって書かなくて良い分Rubyとかの方がより楽だけど)

Javaの無名クラスはウンコ。ノイズが多すぎる。
169デフォルトの名無しさん:2011/06/23(木) 22:32:54.64
class can_divide {
int n_;
public:
can_divide(int n) : n_(n) {}
bool operator()(int x) const { return x % n_ == 0; }
};
170デフォルトの名無しさん:2011/06/23(木) 22:36:23.66
クロージャーって
メソッドを二つ持っているオブジェクトを
代入したいようなときってどうするの?
171デフォルトの名無しさん:2011/06/23(木) 22:37:23.88
>>170
どういうことだ
172デフォルトの名無しさん:2011/06/23(木) 22:37:29.35
>>158
何を持って動的としてるか解からんなぁ。
タダの動的型付け言語のことをいうとるんじゃろうか。
173デフォルトの名無しさん:2011/06/23(木) 22:50:25.52
>>169
int function()
{
static int n;
struct _:interface<int>
{
bool operator()(int x) { return x % n_ == 0; }
} closeure;
algorithm(static_cast<interface<int>&>(closeure));
}
174デフォルトの名無しさん:2011/06/23(木) 22:55:14.51
ローカル変数の意味がC/C++とちがうというだけ
175デフォルトの名無しさん:2011/06/23(木) 22:56:34.87
C/C++に高級なローカル変数がないと言いたいのか?
176デフォルトの名無しさん:2011/06/23(木) 23:41:53.64
高級なローカル変数w
177uy ◆yyC0rYWEq2 :2011/06/23(木) 23:56:18.92
高級なローカル変数
>>234
178デフォルトの名無しさん:2011/06/24(金) 00:49:18.61
>>158
動的言語で短いコードを書くためには、実行時メタ機能などを
使いこなす必要があるが、土方レベルのPGには使いこなせず、
静的言語にもある機能だけでプログラム書くから

    だから、土方が動的言語を使っても短く書けない
179デフォルトの名無しさん:2011/06/24(金) 00:49:54.44
class Silver {
public:
    const Platinum to_platinum() = luxury;
    const Iron to_iron() = cheap;
};
180デフォルトの名無しさん:2011/06/24(金) 00:52:39.93
ら、らっくすうりぃ
181デフォルトの名無しさん:2011/06/24(金) 01:20:52.76
>>178
じゃあ、責任持って
実行時メタ情報とやらを使うのと
使わないのとでどれくらい差があるかを
例示してね。できなきゃ笑おう。みんなでw
182デフォルトの名無しさん:2011/06/24(金) 01:28:07.80
>>181

まずは>>158
> なんで短いコードなら動的言語は圧倒的に少ない行数でかけるのに、
> 普通のプロジェクトでは大差がないのか考えてみた。

と言っているので、大差ないという例をコード付きで示してもらおう。
そして、そのウンココードを見て笑おう。

そのあとなら、そのウンココードを短くしてあげても良いよwww
183uy:2011/06/24(金) 01:28:28.99
>>158
何が「こんなところかな?(キリッ)」 なわけ

>普通のプロジェクトは大差ないって、
はぁあ? どこのプロジェクトを比較してんの???

>変数宣言に関しては
静的言語だろうとハッシュ利用すれば宣言なしで使えるし
動的言語でも、変数宣言は行うから。 いきなりコードの途中から変数つくって使ったら
可読性下げるに決まってんだろ、 だから土方には仕えないって言ってるんだよ

>クラスをかかなくていい?
は? wwwwwwww 動的静的かんけいねえよwwwwwwwバカなの??Wwwww
アルゴリズムレベルでもの考えろよwwwwwwww

>関数
は??? 関数を作ることでコード削減って意味不明
関数も含めてソースコードだろうがwwwwwww
つうか何?? オブジェクト指向限定でもの言ってんの????wwwwwwwww
まずそこからして以下略


よく考えてから書き込みしてくれ・・・・・・・・・・・・・・・・・・・・・・
184uy:2011/06/24(金) 01:29:27.37
>>182
気持ち悪い 氏ね
185デフォルトの名無しさん:2011/06/24(金) 01:37:29.49
つーか短く書けるってのは言語の評価軸のひとつにすぎない
短く書けても他にデメリットがあるなら全体としての評価は下がる
186デフォルトの名無しさん:2011/06/24(金) 01:43:47.86
Perlで短く書かれてるときの絶望感w
187デフォルトの名無しさん:2011/06/24(金) 01:44:15.11
単純なコードでなければ、ライブラリの有無で決まるんじゃないの。
188デフォルトの名無しさん:2011/06/24(金) 01:51:41.65
動的言語はPython3やRuby1.9程度の小変更で
移行に苦労しているからな
大規模プロジェクトに使うなんてとても無理
189デフォルトの名無しさん:2011/06/24(金) 01:53:33.10
190デフォルトの名無しさん:2011/06/24(金) 01:55:46.41
>>188
Ruby1.9やPython3レベルの"後方互換性の無い"変更が
Javaで起こったら暴動が起きるレベル
191デフォルトの名無しさん:2011/06/24(金) 02:02:05.19
>>158を静的動的関係ないって言ってる人たちは>>60とか>>64の段階でそれに突っ込んでれば
こんな話にはならなかったのにねえ。
192デフォルトの名無しさん:2011/06/24(金) 02:10:54.94
>>189
それそれ。
結局ある程度の規模になると、
どうしてもそういう風になっちゃうよね。

あまり短くなったと思えない。
193デフォルトの名無しさん:2011/06/24(金) 02:14:02.88
てーか>>158は本質を分かってないんじゃないか
動的言語だって関数もクラスも書くけど、問題はそこじゃなくて「どう書くか」なんだよ

たとえば「あるモジュールのあらゆるメソッドの呼び出しの前後に処理を挟みたい」とか
静的言語だと悪夢だけど動的言語だとそうでもない。

たとえば「コールバック引数を受けとるeachメソッドを使うようにしたら、呼び出し側の記述量が逆に増えた」とか
言語によっては全然増えない。

そういう「動的言語なら簡単に書ける」設計をしないんなら、そりゃ静的言語と大差ない記述量になるだろう。
194デフォルトの名無しさん:2011/06/24(金) 02:19:29.03
> 静的言語だと悪夢だけど動的言語だとそうでもない。

静的言語でもそうでもない。

たとえばJavaならAspectJを使えばいい。
また実務なら何らかのフレームワークを使うわけで、
そのフレームワークにフィルタやフックなどの名前で同じことができる。
springフレームワークにもAOPの機能がある。

そう、ここに書き込める程度の小さい例なら言語に搭載している分
短くかけるが、実務なら言語に搭載してなくても、ライブラリによって補完
するわけで大差がなくなるわけさ。
195デフォルトの名無しさん:2011/06/24(金) 02:23:01.21
「動的言語なら簡単に書ける」設計が
メソッドの前後に処理を入れていくことで
創り上げる設計なのか?
196デフォルトの名無しさん:2011/06/24(金) 02:25:53.65
オブジェクト指向設計や
構造化設計なら聞いたことあるが
動的言語設計なんてのは聞いたこと無いな?

どうせ動的言語でも設計はオブジェクト指向とかなんだろ?
197デフォルトの名無しさん:2011/06/24(金) 02:29:47.65
>>182
これと同等のコードを静的言語で何行でかける?
まぁ、Boost使えば1行で済んだりはするけど。
function Example( object )
{
     object.ExampleHoldMethod = object.Method;
     object.Method = function( arg )
     {
           object.ExampleHoldMethod("preset",arg);
     }
     with({ result:othreObject.Method( object ) })
     {
            object.Method = object.ExampleHoldMethod;
            return result;
     }
}
198デフォルトの名無しさん:2011/06/24(金) 02:47:47.20
>>182
やっぱ本質を分かってないよ。

それと同じことをするコードを0から作ったら
行数は増えるよ。

だけど、現実にはそんなことをするための
ライブラリを使うことで、わずかの行で済む。


まさにこう言うことじゃないか。
> 4.関数を作らない前提の比較だから
> 短いコードでは基本的に関数を作成しない。実際のプロジェクトでは関数を
> 作ることで大幅にコードの削減をしているが、短いコードの例ではその利点が生かせない。
199デフォルトの名無しさん:2011/06/24(金) 02:54:33.62
全然意味の無いプログラムでいいなら
以前Pythonスレで見たこれを静的言語で書いてみてほしい
興味本位なんで言語の優劣とは関係なしで

def nesteddict():
  return defaultdict(nesteddict)

d = nesteddict()
d[0][1][2][3][4] = 5
200デフォルトの名無しさん:2011/06/24(金) 02:59:17.74
動的言語では、関数を置き換えるのが仕事ですw

今日もバグってる関数が見つかったら。
今すぐ入れ替えます!と答えてる。
201デフォルトの名無しさん:2011/06/24(金) 03:02:15.52
>>199
defaultdictという関数の実装を教えてくれ。
202デフォルトの名無しさん:2011/06/24(金) 03:02:23.14
そろそろ動的言語原理主義者みたいなの現れないの?
動的言語で作られたソフト以外は拒否するみたいな
203デフォルトの名無しさん:2011/06/24(金) 03:09:02.11
なんでオブジェクトありきでしか動的言語を語れないんだ?

let prefix = "Text";
let function = prefix & "Output";
function("text");

こういうメタシステムでも動的だろもっと視野を広げろよ。
204デフォルトの名無しさん:2011/06/24(金) 03:09:27.23
本物の実装じゃないみたいだけどこんな感じか?
Pythonしらんから良く解らんが、これをJavaで書けばいいのか?
今度はdefault_factoryの実装が必要になりそうだが。
http://d.hatena.ne.jp/odz/20071216/1197817317

class defaultdict(dict):
  def __init__(self, default_factory = None, *args, **kwargs):
   dict.__init__(self, *args, **kwargs)
   self.default_factory = default_factory

  def __missing__(self, k):
   if self.default_factory is not None:
    self[k] = self.default_factory()
    return self[k]
   else:
    raise KeyError(k)

まあ、結局はコードが短く書けるかどうかってのは、
そういうクラスが用意されているかの問題でしかない。
205デフォルトの名無しさん:2011/06/24(金) 03:11:29.53
>>203
それ、VBのCallByNameみたいなもんか?
206デフォルトの名無しさん:2011/06/24(金) 03:12:30.48
>>201
defaultdictは辞書(ハッシュマップ)のコンストラクタで、
Autovivificationするときに引数にとったクロージャを
オブジェクトの生成関数として使う
207uy ◆yyC0rYWEq2 :2011/06/24(金) 03:29:59.79

しつもんです

JAVA(笑)でこれかくとどうなるんですか

require"ostruct"


v = OpenStruct.new ({ :x => 11 , :y => 22 })

p v.x
p v.y
p v.n = 99

208uy ◆yyC0rYWEq2 :2011/06/24(金) 03:34:43.68

しつもんです

C#(笑)でこれかくとどうなるんですか


p ("1".."9").map(&:next).map(&:to_i).inject:+


def a
p 1
yield iterator?
p 3
end
a do p 2 end
209uy ◆yyC0rYWEq2 :2011/06/24(金) 03:37:22.64

しつもんです

C++(笑)でこれかくとどうなるんですか


("a".."f").each do | m |
  if "b"==m.."d"==m
    p m
  end
end
210uy ◆yyC0rYWEq2 :2011/06/24(金) 03:57:25.23

しつもんです

これを静的言語でかくとどうなるんですか?


a = ":"
b = "\\(.*?\\)"
"209 :uy ◆yyC0rYWEq2 :2011/06/24(金) 03:37:22.64 " =~ /#{a}(.*)#{b}/

$1.split(//).take(20).each_slice(3)
.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index
.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index
.each_with_index.each_with_index.each_with_index.each_with_index.each_with_index
.each_with_index do | ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( a , z ) , y ) , x ) , w ) , v ) , u ) , t ) , s ) , r ) , q ) , p ) , o ) , n ) , m ) , l ) , k ) , j ) , i ) , h ) , g ) , f ) , e ) , d ) , c ) , b ) |
  print a , b , c , d , e , f , g , h , i , j , k , l , m , n , o , p , q , r , s , t , u , v , w , x , y , z
  puts
end

211uy ◆yyC0rYWEq2 :2011/06/24(金) 03:58:24.73
しつもんです  これをゴミ・・・いや静的(笑)言語でかくとどうなるんですか?
kiu =[
[ "K_SPACE" ] ,
[ "K_COMMA" ] ,
[ "K_PERIOD" ] ,
[ "K_SLASH" ] ,
[ "K_YEN" ] ,
[ "K_COLON" ] ,
[ "K_SEMICOLON" ] ,
[ "K_BACKSLASH" ] ,
[ "K_LBRACKET" ] ,
[ "K_RBRACKET" ] ,
[ "K_MINUS" ] ,
[ "K_AT" ] ,
[ "K_PREVTRACK" ] ,
]
kiu2 = [" " ,"," ,"." ,"/" ,"\\" ,":" ,";" ,"_" ,"[" ,"]" ,"-" ,"@" ,"^" ,]
kiu3 = [ " " ,"<" ,">" ,"?" ,"|" ,"*" ,"+" ,"_" ,"{" ,"}" ,"=" ,"`" ,"~" , ]
aru = ("a".."z").to_a
suu = ("K_0".."K_9").to_a.rotate
suu2= ("0".."9").to_a.rotate
suu3= (" \! \" \# \$ \% \& \' \( \) 0").split
nnn = aru.to_a.size + suu.to_a.size + kiu.size

p keytable= [ ( ["K_"]*aru.size ).zip( aru.map(&:upcase).to_a ).map(&:join) , suu , kiu ].map(&:to_a).flatten
.zip( [:default]*nnn ).zip( [aru , suu2 , kiu2 ].map(&:to_a).flatten )
.zip( [:shift]*nnn )
.zip( [aru.map(&:upcase) , suu3 , kiu3 ].map(&:to_a).flatten )
.zip( [:control]*nnn ).zip( [""]*nnn ) # .zip( [":command"]*nnn ).zip( ["<command>"]*nnn )
.flatten
212デフォルトの名無しさん:2011/06/24(金) 04:10:03.14
ていうか極限はこうだろ

「eval("code...") をJavaで書いて下さい」
213デフォルトの名無しさん:2011/06/24(金) 04:10:44.06
あ、もちろんローカル変数にアクセスできないとダメですよ?
214デフォルトの名無しさん:2011/06/24(金) 04:11:16.46
>>204
default_factoryはdefaultdict()を呼び出す側が用意するもの(>>199 では nesteddict を渡している)だから
インタフェースや宣言はしても、実装はしちゃダメよ
215uy ◆yyC0rYWEq2 :2011/06/24(金) 04:22:42.93
>>212
みんなわかっているよ
ハンデは与えてやれよ・・・・・・・
頑張ればまだ静的言語でかけるかもしれないコードをおれはのせたよ
静的言語でやったら冗長するんだろうけどねwwwwwwwww
216デフォルトの名無しさん:2011/06/24(金) 04:28:25.64
>>215
ローカル変数へのアクセスがなくてもいいんならDynamicJavaとか(保守されてないけど)
既存のコードもあるんだけどね。
217uy ◆yyC0rYWEq2 :2011/06/24(金) 04:57:29.50
ローカル変数にアクセス出来ないのは、いずれ改善されるとは思ってる
eval以外のクロージャにしてもlambdaにしても、ローカル変数にアクセス出来ないなんて
利用価値がないし
218デフォルトの名無しさん:2011/06/24(金) 05:20:29.35
1.7ですらクロージャまわりは残念な状況だし、どうなるかな
219デフォルトの名無しさん:2011/06/24(金) 06:18:51.77
C#でコンパイラ使ってダイナミックオブジェクト生成
220デフォルトの名無しさん:2011/06/24(金) 07:07:21.85
あ、もちろんローカル変数にアクセスできないとダメですよ?
221デフォルトの名無しさん:2011/06/24(金) 08:14:06.67
>>206
そういうdefaultdictが用意されているという前提で、
それを利用するコードを書けばいいのか?

Javaならクロージャの代わりに無名クラスに
するだけの話だと思うが・・・
222デフォルトの名無しさん:2011/06/24(金) 08:32:50.42
>>211
こんなオナニーコードじゃなくて金になりそうな例でお願いします
223uy ◆KOAgYBL/Xg :2011/06/24(金) 09:12:36.98
つまり、かけないと
224デフォルトの名無しさん:2011/06/24(金) 09:28:37.88
一行ってだけで、効率悪い。
一行が必須なら、それに当たるメソッドつくれば、たいていの言語で、同じコードが動く。
もっと、らしいのを出してこい。
225uy ◆KOAgYBL/Xg :2011/06/24(金) 09:40:31.98
いいから黙って211やれや
226デフォルトの名無しさん:2011/06/24(金) 10:26:34.37
>>211を静的()言語のF#でやってみた
http://ideone.com/vXzC8
227デフォルトの名無しさん:2011/06/24(金) 10:48:44.07
eval野放図に使って安全はないだろ。カプセル化したら意味ないし。
228デフォルトの名無しさん:2011/06/24(金) 10:49:24.12
>>221

>>199 の nesteddict は常に同じ型のオブジェクトを返してるから
面白くない
てわけで、こっちはどう?
defaultdictに相当する関数は型宣言だけで中身は書かなくて良いよ

def nesteddict(n):
    def f(m=n):
        return nesteddict(m-1)
    return defaultdict(f) if n > 0 else defaultdict(list)

d = nesteddict(5)
d[0][1][2][3][4][5].append('a')
229デフォルトの名無しさん:2011/06/24(金) 10:56:12.07
スレタイも読めない動的言語(笑)

安全なソフトを作ることに自信がないからって、ちっちゃなトイプログラムが
簡潔に書けることをアピールしだすwww

うゆさんの投下するプログラムって、簡潔なのにすごく「安全なソフトウェア」ですね^^^^^
230uy ◆KOAgYBL/Xg :2011/06/24(金) 11:01:54.70
231デフォルトの名無しさん:2011/06/24(金) 11:08:09.24
>>210を性的なF#で書いてみた
http://ideone.com/FBs8v
同じサイトで元のRubyコード実行してみたけど、ソースに日本語が含まれてるせいか
うまく動かなかったんで、実行結果の比較検証はしてない
232デフォルトの名無しさん:2011/06/24(金) 11:33:18.35
>>229
>>58のいう「スニペットの流用」がどれだけやり易いかを
コードを例にして議論してる

もし、>>58のいうようにスニペットの流用が静的言語の方が優れてるなら、
既存のコードから少ない修正で別の用途にも使えるはず
233デフォルトの名無しさん:2011/06/24(金) 12:26:01.20
いつからトイプログラムスレになったの?
234デフォルトの名無しさん:2011/06/24(金) 12:39:54.75
>>226>>231
エロい人、乙であります
235デフォルトの名無しさん:2011/06/24(金) 13:17:16.77
玩具のような簡単なテストコードは、ユーザーが自分の安全を自分で確認しやすい
難解な手法は「俺が検証しなくても誰かがするだろう」というパターンに陥りやすい
236デフォルトの名無しさん:2011/06/24(金) 14:04:04.66
なんかRubyのRangeやイテレータの類が便利に使える事例と言うだけで
静的動的は関係ない例ばかりだなぁ。
237デフォルトの名無しさん:2011/06/24(金) 14:18:33.35
静的型と関係なく使える道具が増えたら、
動的言語で安全なソフトが作れる可能性が大きくなるな。
238デフォルトの名無しさん:2011/06/24(金) 14:27:50.76
動的言語は
危険、遅い、臭いの三重苦だ
239デフォルトの名無しさん:2011/06/24(金) 14:51:15.04
そういう水掛け論よりはコードで示したほうが建設的だろうに
自慢のIDEでちゃちゃっと書いてくださいよ
え?もしかしてトイプログラムも書けないの?
240デフォルトの名無しさん:2011/06/24(金) 14:53:07.14
あんなネタどうでもいいから、 eval(文字列) を書いて下さいよ。
もちろんevalの手前にあるローカル変数にもアクセス出来る奴。

でなきゃ「動的言語と利便性はたいして変わらない」なんて言えないでしょ?
241デフォルトの名無しさん:2011/06/24(金) 15:08:39.52
その前にevalがあると利便性を感じるような現実的な例を挙げてくれ。
242デフォルトの名無しさん:2011/06/24(金) 15:10:47.41
>>241
データ中にコードを埋め込めるので、データ側で何でも書けるようになる。
243デフォルトの名無しさん:2011/06/24(金) 15:13:07.06
具体例を挙げてくれ。
244デフォルトの名無しさん:2011/06/24(金) 15:14:56.08
evalで安全なソフト
245デフォルトの名無しさん:2011/06/24(金) 15:17:36.88
#!/usr/bin/perl -w
$_='while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(
$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16
-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h
=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$
d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=$t&($d>>12^$d>>4^
$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^
(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
246デフォルトの名無しさん:2011/06/24(金) 15:18:14.65
>>244
そりゃサンドボックスの話になるな。べつに不可能事じゃない。
247デフォルトの名無しさん:2011/06/24(金) 15:27:57.94
eval自体がどうっていうより、パーサとインタプリタを内蔵することで機能拡張を可能にするアプリならいくらでもある。
emacs ,、GIMP, ブラウザ, 等がそうだな。
アプリの上で動くスクリプトを書くんじゃなくて、そういうアプリを作るにはパーサとインタプリタを含むエンジンを内蔵するしかない。

もう一つのパターンは、単に「簡単なリフレクション」として用いられる。
リフレクションが必要だと思われるあらゆる例で、リフレクションよりも簡潔に書くことができる。
248デフォルトの名無しさん:2011/06/24(金) 15:34:12.26
evalが無い、はいそうですね。でおしまい。

>>86で挙げられたPythonの型チェックにしても実行前に検証は可能かと
問われればそれは無理。これもはいそうですね、でおしまい。

つうかパラダイムが違うんだから一方で存在する機能が他方で存在しない
ことなんて普通。

evalがどうしても必要な問題ならevalが存在する言語でプログラム書けば
良い。自分だけの小道具として使うならともかく、他人様の入力を受け
付けるシステムで気軽に使える場面がそう豊富だとは思わないが。
249デフォルトの名無しさん:2011/06/24(金) 15:42:17.26
>他人様の入力を受け付けるシステムで気軽に使える場面がそう豊富だとは思わないが。

インタプリタを内蔵してるアプリなんて別に珍しくないんだが。
それらは安全性のために色々仕掛けを施してはいるが、
結局やってることはevalと変わらない。

で、たとえばサーバ用途でならevalで十分なシチュエーションは普通に存在する。
動的言語で使われるテンプレートシステムのいくつかは実際にevalに依存してるしな。
利便性があるというのがtrueなのは間違いない。

静的言語で同じことをやろうとすると大がかりなインタプリタが必要になる上に、
コールスタック上のローカル変数にアクセスする手段が提供されないので
実装が余計に面倒になる。
別に不可能事はなにもないのだが、煩雑なばかりで何も嬉しくない。
250デフォルトの名無しさん:2011/06/24(金) 16:15:10.46
>>249
>利便性があるというのがtrueなのは間違いない

特定の用途に関して利便性があるのは否定しないよ。

ただ「気軽に使える場面がそう豊富だとは思わない」と書いたように、通常
のプログラミングの中でどれだけ使える場面があるのかということ。
毎日テンプレートエンジン書いたりインタプリタの組み込みをしている人間
がどれだけいる? それは結構、特殊だよ。

そもそもevalを気軽に使える場面が豊富なプログラミング言語なんて嫌だw
そういう場面ではevalではなく通常の構文の範疇で同じ事を簡単にかける
ように言語は設計されているべき。
251デフォルトの名無しさん:2011/06/24(金) 16:17:31.43
>>249
ちなみに静的言語で同じ事をするのにスクリプト機能であればインタプリタ
の実装を拾ってきて組み込むし、テンプレートエンジンであればパーサーを
書くでしょう。実際どちらも便利なツールやライブラリの類が存在するので
そう難しい話ではない。

evalで実行環境のインタプリタを流用するのは簡単だけれども、入力を検証
しないと危ないし、テンプレートエンジンにしても受領できる構文がホスト
言語の構文にどこかしら縛られる。
252デフォルトの名無しさん:2011/06/24(金) 16:18:26.69
>>250
そもそもよくある例だから挙げられてるんじゃないよなコレ

動的言語らしい機能の端的な面として出てきてるだけで。
253デフォルトの名無しさん:2011/06/24(金) 16:25:38.74
動的型付けだからeval乱舞って、そんなわきゃない
極端すぎる
254デフォルトの名無しさん:2011/06/24(金) 16:28:50.93
>>252
うん。だから>>240についても答えは、

「eval無いよ。でも無くても動的言語と利便性はたいして変わらない。
 だってeval使わなきゃならない場面なんて良くある例じゃないし」

になるんだよな。
255デフォルトの名無しさん:2011/06/24(金) 16:30:57.22
じゃあ利便性が劣ってることは認めるんだな。

evalだけならともかく、実際には動的言語らしい機能って他にも一杯あるしな。
256デフォルトの名無しさん:2011/06/24(金) 16:33:59.72
多分このスレで一番スレタイに近いこと言ってるのは>>18

テストを普通に書けば動的言語でも安全だし、
テスト不足なら静的言語でも危険だろう。
257デフォルトの名無しさん:2011/06/24(金) 16:44:07.76
それは脳内理論にすぎない
現実の大規模システムで使われているのは静的言語
258デフォルトの名無しさん:2011/06/24(金) 16:45:03.68
単に膨大なレガシーコードがあるというだけだから
259デフォルトの名無しさん:2011/06/24(金) 16:48:05.60
twitterみたく動的言語で作っても規模が大きくなったら
静的言語で書き直さなきゃらならい羽目になるんだったら
最初から静的言語で書いた方がいいよな
260デフォルトの名無しさん:2011/06/24(金) 16:49:39.21
早すぎる最適化という言葉をまだ知らない奴がいるのか
261デフォルトの名無しさん:2011/06/24(金) 16:50:39.68
動的言語のほんのちょっとテストが書きやすいなんてのは
型チェックがなくて余分にテストを書かないといけない分であっという間にマイナスだろ
262デフォルトの名無しさん:2011/06/24(金) 16:50:48.56
twitterみたいな動かしてみるまで人気出るか分からんサービスでもか?
263デフォルトの名無しさん:2011/06/24(金) 16:53:48.33
>>260
おまえが知っているのは言葉だけで中身知らないだろw
264デフォルトの名無しさん:2011/06/24(金) 16:54:54.84
>>261
それって動的言語はテストを書くけど
静的言語は全然テスト書かない場合の比較ですよね?
265デフォルトの名無しさん:2011/06/24(金) 16:56:57.96
>>264
そんなわけない
動的言語には大規模プロジェクトそのものがないから比較不可能だけど
266デフォルトの名無しさん:2011/06/24(金) 16:58:22.59
>>265
じゃあテスト書いてみてよ
267デフォルトの名無しさん:2011/06/24(金) 17:01:16.71
268デフォルトの名無しさん:2011/06/24(金) 17:03:44.24
動的厨に言う大規模って
Webサイトのアクセス数って意味?
269デフォルトの名無しさん:2011/06/24(金) 17:04:44.70
>>261
実際問題、動的言語だと型チェックよりも欲しい型への変換のが多くね?
結果的に「型変換出来ない=例外吐くになる」ってのが多いわ
例えば「引数として型Aを要求する関数」よりも「引数を『型Aを表す何か』として解釈し、そのように振る舞う関数」を書く
結果的に、型Aへの変換が出来ない引数は淘汰される感じ
270デフォルトの名無しさん:2011/06/24(金) 17:04:57.82
271デフォルトの名無しさん:2011/06/24(金) 17:12:42.32
動的言語って静的言語のライブラリをラップしたライブラリ使わないと
使い物にならないよね
272デフォルトの名無しさん:2011/06/24(金) 17:14:51.41
>>271
その言語を使ってどんだけのコードを書くかの問題じゃないか?
そもそもライブラリの安全性とそれを呼び出すコードの安全性ってそれぞれ違うし、
スレタイに関係ない話だと思う
273デフォルトの名無しさん:2011/06/24(金) 17:16:26.83
動的厨は自分ではさんざんスレタイと関係ないこと話すのに
ちょっとでも不利なことになるとすぐこれだw
274デフォルトの名無しさん:2011/06/24(金) 17:20:04.24
>>270 から何をどう発展させろってんだよwww

強いて言えば、スクリプトってのはむしろ静的言語にエンジン組み込んで動かすものだよね
JavaScriptもサーバで使うようになってきたし。JITも入ってるから静的言語だな
275デフォルトの名無しさん:2011/06/24(金) 17:20:33.04
だって全然デメリットじゃないじゃんそれ

このスレは、静的/動的両方の言語を安全に使えるPGと、
静的言語(典型的にはJava)しか使えないPGが
意見を戦わせてるんだよ?
276デフォルトの名無しさん:2011/06/24(金) 17:23:18.97
>>255
うん。evalについてはね。直接対応する機能が無いのだから当然。
ただ劣るにしても程度問題で、普段滅多に使う場面がないなら劣るに
しても微々たるもの。

>evalだけならともかく、実際には動的言語らしい機能って他にも一杯あるしな。

それも個別に検証しないとね、
277デフォルトの名無しさん:2011/06/24(金) 17:28:12.76
動的言語の大規模ソフト例を聞くと
アクセス数の多いサイトを出してくる
動的言語しかつかえないPGと、
静的言語で安全な大規模ソフト作っているPGが
意見を戦わせるスレだろ
278デフォルトの名無しさん:2011/06/24(金) 17:28:57.93
amazonとか別にサイト部分だけperlな訳じゃないよな。
279デフォルトの名無しさん:2011/06/24(金) 17:31:56.90
>>277
安全なソフトを日々作ってるプログラマなら
テストは書き慣れてるよね?書いてみてよ
280デフォルトの名無しさん:2011/06/24(金) 17:32:34.04
どっちにしろ、事例だけで確定するんならこのスレいらん

「Amazon uses Perl in a variety of ways through their enterprise. They have a custom application framework called Gurupa which is a bridge between a service layer and Mason.」
でスレタイに反例が存在してることになるので終了ということになる。
281デフォルトの名無しさん:2011/06/24(金) 17:46:02.02
282デフォルトの名無しさん:2011/06/24(金) 17:49:48.73
Pythonによって実装されているフリー/オープンソースソフトウェアなんて大げさに書かれているけど
ちょこっと拡張用に組み込まれた程度のものが混じっているのな
283デフォルトの名無しさん:2011/06/24(金) 17:52:07.34
284デフォルトの名無しさん:2011/06/24(金) 17:53:18.93
動的厨の言う大規模ソフトって
アクセス数が多いとか商品数が多いWebサイトなのな
285デフォルトの名無しさん:2011/06/24(金) 17:55:40.35
今時、大規模なシステムを1個の複雑なソフトで作ることの方が稀だな

Google uses Python for many tasks including the backends of web apps such as Google Groups, Gmail, and Google Maps, as well as for some of its search-engine internals
googleが安全かどうかは意見が分かれるところだが。

NASA is using Python to implement a CAD/CAE/PDM repository and model management, integration, and transformation system which will be the core infrastructure for its next-generation collaborative engineering environment
NASAが安全かど(ry

the organizations that use Python.
http://wiki.python.org/moin/OrganizationsUsingPython
Financial の分野でも普通に使われてる
286デフォルトの名無しさん:2011/06/24(金) 17:56:25.20
静的厨が発狂してることだけはわかった
287デフォルトの名無しさん:2011/06/24(金) 17:56:39.02
Pythonがアプリに組み込まれるのは
動的言語の方が実装しやすいとか
馬鹿でも使えるとかそんな理由だろ
288デフォルトの名無しさん:2011/06/24(金) 17:56:46.08
>>284
静的厨のいう大規模ソフトってのは
土方を大量に集めて開発したって意味だよね
289デフォルトの名無しさん:2011/06/24(金) 17:57:15.43
大規模っていうからには、年間開発費が10億円以上だろ
290デフォルトの名無しさん:2011/06/24(金) 17:57:44.07
291デフォルトの名無しさん:2011/06/24(金) 17:58:20.37
>>287
馬鹿でも使えるって意味ではJava最強
これは褒めてる
292デフォルトの名無しさん:2011/06/24(金) 17:59:02.41
馬鹿に書かせても馬鹿なコードを書かれない、ってむしろ静的厨の主張する静的言語の特長だったよねw
293デフォルトの名無しさん:2011/06/24(金) 17:59:10.58
今時、大規模なシステムを1個の複雑なソフトで作ることの方が稀だな
294デフォルトの名無しさん:2011/06/24(金) 17:59:42.75
アプリの拡張には馬鹿でも使えるってのは重要
Heskellスクリプトなんて入れたらユーザーは怒るだろ
295デフォルトの名無しさん:2011/06/24(金) 18:02:59.93
静的厨のいう「大規模なソフト」自体が問題分割に失敗した悪い例だな。

まともな設計者なら問題を適切に分解して、大規模じゃないソフトの集合にしてしまうだろうし、
そうなると言語の選択ポイントは「(馬鹿に書かせても)安全かどうか」ではなくなってしまう。
どうせテストはするんだしな。

スレタイの反例も十分出したし、このスレもういらね
296デフォルトの名無しさん:2011/06/24(金) 18:06:18.87
動的厨の言う大規模は
アクセス数やページ数が多いWebサイトだからな
しかもバックエンドに静的言語で作られたソフトを使った
297デフォルトの名無しさん:2011/06/24(金) 18:07:48.56
そのバックエンドのさらに下はSQLだからなwww
298デフォルトの名無しさん:2011/06/24(金) 18:10:18.27
データベースが動的言語で出来てると思ってる?
299デフォルトの名無しさん:2011/06/24(金) 18:10:46.38
で、「(馬鹿に書かせても)安全だから」って理由で静的言語で書かれた大規模なソフトって何だよ?
300デフォルトの名無しさん:2011/06/24(金) 18:12:29.92
>>295
まあWindows界を筆頭に、1つのソフトに何でも詰め込む設計が跋扈してるからなあ
301デフォルトの名無しさん:2011/06/24(金) 18:13:46.93
>>298
中身が何であろうと、SQLを扱う上では動的コードの視点に立たないと穴ぼこだらけになっぞ?
302デフォルトの名無しさん:2011/06/24(金) 18:24:39.44
アセンブラは動的言語
303デフォルトの名無しさん:2011/06/24(金) 18:25:27.37
brainf*ckは静的言語
304デフォルトの名無しさん:2011/06/24(金) 18:34:26.54
アセンブラは実行時の型チェックもないからな
305デフォルトの名無しさん:2011/06/24(金) 18:34:38.06
SQLが動的言語って、どういう意味で動的って言っているの?
306デフォルトの名無しさん:2011/06/24(金) 18:37:23.98
動的SQLの意味に決まってるだろう
JDBCで使ったことあるんじゃない?
307デフォルトの名無しさん:2011/06/24(金) 18:49:02.09
動的SQL(Dynamic SQL)と動的言語は違うだろう。
SQLに対する理解が足りないのか動的言語に関する理解が足りない
のかはっきりしてくれ。

ぶっちゃげ呼び出し側から見れば動的SQLは普通のクエリ実行よりも
よっぽど静的だ。
308デフォルトの名無しさん:2011/06/24(金) 18:59:48.82
eval脳ではSQLインジェクション
309デフォルトの名無しさん:2011/06/24(金) 19:04:52.51
動的言語は実行時にしか型エラーがみつからないから
ダメだっていってるひとがいた
310デフォルトの名無しさん:2011/06/24(金) 19:06:01.17
311デフォルトの名無しさん:2011/06/24(金) 19:16:21.84
テストを書けば動的も静的も関係ないって話はC0でも良いからカバレッジ何パーセントくらいで言えるんだろう。
また、ホビー、金融系、Webの緩いのや硬いのでも現実的にテストにさける時間は変わってくるよね。
テストで担保するって話が土台になるならここの前提はとても重要だと思う。
312デフォルトの名無しさん:2011/06/24(金) 19:19:42.58
アセンブラは動的言語
313デフォルトの名無しさん:2011/06/24(金) 19:31:41.89
性的言語は好きですか?
314デフォルトの名無しさん:2011/06/24(金) 20:41:50.14
>>311
実験に時間をさく事は現実的ではなくて
しかも「時間のかからない安全策」が現実的だと言いたいのか?
そんな都合の良い現実がどこにあるんだ
315デフォルトの名無しさん:2011/06/24(金) 20:57:35.17
>>307
要するに静的だろうとテストはしっかりやらなきゃダメってことだろ
316デフォルトの名無しさん:2011/06/24(金) 21:02:20.25
テストって何って感じの人には
317デフォルトの名無しさん:2011/06/24(金) 21:25:02.06
動的か静的かはさておいて、データ構造やアルゴリズムの基礎も知らん人に
プログラミングできる環境を提供して欲しくないな。
素人の作ったソースのメンテやらされて大迷惑だよ。
本当に抽象的・数学的思考のできない奴に、コード書かせるなよ。
318デフォルトの名無しさん:2011/06/24(金) 21:33:29.37
うちでは使えない奴は本番では使われないダミーコード書かせてる
319デフォルトの名無しさん:2011/06/24(金) 21:49:01.31
難しいといわれてたオブジェクト指向をここまで簡単と言わせるJavaってすごいな
320デフォルトの名無しさん:2011/06/24(金) 22:34:16.12
それって、オブジェクト思考が難かしかったんじゃなくて、慣れてなかっただけ
なんじゃないの?
321デフォルトの名無しさん:2011/06/24(金) 23:27:29.97
テストは必要だけど、たくさん書くと
コード修正時のメンテナンスが大変になる。

だからテストもなるべく少なくするほうがいい。
もちろん少なくすると言っても必要なテストを省くという意味じゃないよ。

で、静的言語だとテストの一部を実際に使用するコード側に
移動して減らすことができる(実行前の静的テストに変更できる)
322デフォルトの名無しさん:2011/06/24(金) 23:30:09.88
しかしコードを見るとオブジェクト指向でもなんでもないっていう
323uy ◆KOAgYBL/Xg :2011/06/24(金) 23:34:05.36
オブジェクト指向なんて
コード触って1〜2年目には誰だって辿り着くもんだぞ
変な書籍が大量にでて、それを読んで凝り固まった考えを流布し始める奴が多いから言葉の定義すら曖昧になって
オブジェクト指向とは一生かかっても誰も習得できない技術となった
324デフォルトの名無しさん:2011/06/24(金) 23:38:03.51
しかしコードを見るとオブジェクト指向でもなんでもないっていう
325uy ◆KOAgYBL/Xg :2011/06/24(金) 23:50:05.42
オブジェクト指向は韓国みたいなもの
新しい画期的な概念がでてくると、「これはオブジェクト指向のひとつだ!」
みたいに言い出す こわい
326デフォルトの名無しさん:2011/06/25(土) 00:17:21.88
オブシコはオワコン。
327デフォルトの名無しさん:2011/06/25(土) 00:25:32.89
オブジェクト指向型と関数型と静と動が合体した言語は無いの?
328デフォルトの名無しさん:2011/06/25(土) 00:36:40.14
C++0x辺りは、それっぽい事ができると思う。
329デフォルトの名無しさん:2011/06/25(土) 00:40:18.02
C++は基礎知識として必修させるべきだと思う。
OOPLや動的言語がどう内部で処理されてるか理解しない奴は土方。
330デフォルトの名無しさん:2011/06/25(土) 00:43:44.33
>>329
それはいいね。
動的言語ばかり使っているやつって
内部実装に無頓着になりがちだから。

数値?文字? そんなのどっちも
変数に入れられるじゃん。みたいな。
331デフォルトの名無しさん:2011/06/25(土) 00:45:31.19
Javaとかでも = null が何を意味してるかわかってない奴多いし
332デフォルトの名無しさん:2011/06/25(土) 00:52:21.94
333デフォルトの名無しさん:2011/06/25(土) 00:52:57.33
334デフォルトの名無しさん:2011/06/25(土) 00:53:13.31
>>329
OO プログラミングだけならいわゆる LL とかで、自分で実装してみるのも良いと思う。
335デフォルトの名無しさん:2011/06/25(土) 00:54:17.37
なにを?
336デフォルトの名無しさん:2011/06/25(土) 01:08:05.43
>>335
文章が分かり辛くてごめん。
オブジェクトシステムを自分で実装してみる。
337uy ◆KOAgYBL/Xg :2011/06/25(土) 01:10:20.83
>>330
内部理解とかもうどうでもいい
ハードを意識してプログラム組む時代は終わった
数値、文字列を、同じ箱に入れられないのはハードウェアの事情なだけで

そのゴミ、ハードウェア上でどのように数値、文字列を表しているかなんて、
それさえもひとつの手法でしかない為、知らなくても別に良い
10年たてば事情が変わってる可能性さえある
最高で完璧で枯れた技術だったら誰もが覚える価値はあるけど、現状そうではないと思う
338デフォルトの名無しさん:2011/06/25(土) 01:10:41.56
339デフォルトの名無しさん:2011/06/25(土) 01:16:50.84
わからない奴ほどどうでもいいという
340デフォルトの名無しさん:2011/06/25(土) 01:28:56.64
ある知識が必要かどうかという話に、その知識を知らない人は参加できるか否か。

自分には>>330 の言う内部実装の知識はないが。
341デフォルトの名無しさん:2011/06/25(土) 01:35:51.02
>>329と>330の間には溝がある気がしなくもないが
C++のvtableぐらいはやっとくとすごい有益
342デフォルトの名無しさん:2011/06/25(土) 05:05:48.23
動的言語の内部実装で言えばPerlのOOPシステムは
生で使うと内部実装が表に出まくりだな

クラスはパッケージであり、メソッドはパッケージに所属する関数であり
フィールドは単なる連想配列であり、結果として
オブジェクトとはパッケージ情報が付加されただけの連想配列である
…というのがまる見え
343デフォルトの名無しさん:2011/06/25(土) 05:07:07.39
パッケージ…と書くとPerl用語になってしまうから
より一般化すれば名前空間ってところか
344uy ◆KOAgYBL/Xg :2011/06/25(土) 05:57:20.50
PerlerってPerl6やってないの
345デフォルトの名無しさん:2011/06/25(土) 09:48:51.27
PythonのOOPもちょっと内蔵はみ出てて
内部実装見えちゃってるな
346デフォルトの名無しさん:2011/06/25(土) 09:57:57.05
>>321
ふーん。不思議なことをいう人だね
ちょっと実例だしてみてよ
347デフォルトの名無しさん:2011/06/25(土) 11:00:05.60
>>323
Smalltalkなら1、2年で会得出来るだろうけど
JavaやC#だと下手すると一生解らないだろ
348uy ◆yyC0rYWEq2 :2011/06/25(土) 11:37:03.27
なんで、オブジェクト指向の話をしてるところで言語名がでてくる
それが
> 変な書籍が大量にでて、それを読んで凝り固まった考えを流布し始める奴が多いから言葉の定義すら曖昧になって
といってるんだよ

二度と話かけんなよ
349デフォルトの名無しさん:2011/06/25(土) 11:50:56.90
優秀なエンジニア5人は二流の1000人を完全に凌駕する
http://el.jibun.atmarkit.co.jp/rails/2011/06/51000-6676.html


大規模開発www
350uy ◆yyC0rYWEq2 :2011/06/25(土) 12:34:17.80
今の時代なら、まだそれはありえるよ
351デフォルトの名無しさん:2011/06/25(土) 12:41:09.86
海外だと一流1000人とかだからな
日本だと初心者1000人だけど
352デフォルトの名無しさん:2011/06/25(土) 12:48:03.07
難しい機能(OSとかフレームワーク自体の開発とか)だと
優秀なエンジニア5人は二流1000人を超えるかもしれないけど

でもソフトウェアの多くは、実装が難しくもない簡単な機能。
そんなものは一流のエンジニアでも二流のエンジニアでも
実装時間は変わらん。


分かりやすく例えれば、フランス料理フルコースを作るのに
一般の人がいくら頑張ってもまともに作れないけど、
通常の食事程度、弁当とかなら数が集まったほうが多く作れる。
一流シェフに弁当作らせても1000倍速く作れたりしない。
353uy ◆yyC0rYWEq2 :2011/06/25(土) 13:01:55.57
その5人がメタプログラミングをどの程度まで極めているかによるんだよ
メタには限界なし。

あとは、その5人が、過去に何度か似たようなものを作ったことがあって
ソースコードを流用できる場合とか
1000人のほうは1から作っているのにたいして、5人のほうは過去のソースコードの組み合わせをしていくだけになる

ゼロからソースコードを書いた場合の開発効率とか、そういう次元の話はしてないと思うよそれ言ったヤツ
354デフォルトの名無しさん:2011/06/25(土) 13:33:52.11
>>345
少し出てるね、メソッドはフィールドに関数オブジェクト突っ込んだものだし
メソッドが関数だから仮引数としてself渡されたり
ただ、オブジェクトありきの実装だからまだマシかも
355デフォルトの名無しさん:2011/06/25(土) 15:01:01.91
>>323
オブジェクト指向の肝はプログラミングじゃなくてモデリングだろwwww
356uy:2011/06/25(土) 15:16:12.70
>>355
は?
オブジェクト指向の肝って何だよ?肝いなお前
Object Orientedってのはただの形容詞なんだよ
その後にAnalysisがつこうがDesignがつこうがProgrammingがつこうが何でもありだ
お前は肝いからUMLでお絵描きだけしてろ屑
357デフォルトの名無しさん:2011/06/25(土) 15:23:33.07
NGにさわんな
358デフォルトの名無しさん:2011/06/25(土) 15:26:14.37
uy本物 あえて名無しで書き込み

>>356
はああ?


>>355
は?
「コード」触ってりゃっていったわけで
お前はもしかして 本 読まないと無理なタイプ?
死ねよゴミ
359デフォルトの名無しさん:2011/06/25(土) 15:27:02.33
最近は関数型言語のように
副作用、つまり状態を変化させない
関数が流行っている。

オブジェクト指向でも
状態を変更させないように
変化させていくべきだ
360uy ◆yyC0rYWEq2 :2011/06/25(土) 15:29:23.00
OOはマジ宗教

聖書の書き換えをしながら勢力を大きくしていってる
たちのわるい宗派
361デフォルトの名無しさん:2011/06/25(土) 16:16:54.26
>>359
imutableって計算機学の歴史の中でも古くからある概念なんだけどね。
なんで最近まで軽視されてたんだろ。
362デフォルトの名無しさん:2011/06/25(土) 16:19:46.84
>>354
まぁ、カプセル化はオブジェクト指向言語の必須条件じゃないからね。

363デフォルトの名無しさん:2011/06/25(土) 16:33:35.37
C++の関数に付けるconstっていいよね。
オブジェクトが変更されないことが明示されてる。

で、これってコンパイル時に分かるわけだが。
364uy ◆yyC0rYWEq2 :2011/06/25(土) 16:34:37.87
RubyにもFreezがあるし、殆どの言語であるよ多分 ボケナス
それにRubyには大文字で変数宣言すると定数になるし
Ruby最強なんだよ ボケナス
365デフォルトの名無しさん:2011/06/25(土) 16:39:35.08
なんでこの馬鹿は自信満々にアホなこと言うんだろう?
アホだからか
366デフォルトの名無しさん:2011/06/25(土) 16:43:27.09
実行してから分かるのなら、
実行前に教えてくれと思う。

一本道を歩いていたら
行き止まりに、ここで行き止まりですって
書いてあるようなもん。
道の入口に、行き止まりと書いておけ。
367デフォルトの名無しさん:2011/06/25(土) 16:54:50.91
>>366
一本道なら、教えてもらわなくても分かる
368デフォルトの名無しさん:2011/06/25(土) 16:57:14.38
完全に初期化のみ、変更不可って理想的ではあるけど、コピーコストがバカにならんね。
あれさえどうにか出来れば、もっと普及できたんだろうけど。
369デフォルトの名無しさん:2011/06/25(土) 17:21:25.98
>>368
それ以前に参照でオブジェクトを追跡できなくなるのがまずい。
オブジェクト "ヰ" をポインタ "ゑ" で追跡してたとき、
オブジェクト "ヰ" が意味する値が変化したことを "ゑ" に通知する必要がある。
更に、 "ゑ" もその結果に応じて変化することはできないんで、更に上位の参照体に
"ゑ" が意味する値が変化したことを通知する必要が出てくる。
370デフォルトの名無しさん:2011/06/25(土) 17:25:14.09
>>363
int x = 0;
const int &y = x;
std::cout << y << std::endl;  # 0
x = 1;
std::cout << y << std::endl;  # 1
371デフォルトの名無しさん:2011/06/25(土) 17:35:22.51
まぁ、正確には参照先を変更できないって事だわな。
それをいうなら、javaでもC#でもconstは用意できる。

interface ConstXxxxxx
{
getYyyyyy();
}

ConstXxxxxxをとる限り実質変更不可能。
そもそもJavaにconstが無いのは、interfaceで実現できるから
なんだがなぁ。Javaの設計者が如何に思考巡らせていたとしても
結局Javaグラマーがアレだからconstが無い不便な言語、
もしくはconstダサい的な流れになっていく。
372デフォルトの名無しさん:2011/06/25(土) 17:47:06.10
>>369
何を言ってるのかよく分からない
"ヰ"はオブジェクトじゃなくて変数?
373デフォルトの名無しさん:2011/06/25(土) 18:28:29.24
>>372
オブジェクトそのもの。
374デフォルトの名無しさん:2011/06/25(土) 18:43:49.13
>>372

type a = 5;
type *p = &a;

a+=5;

mutableだと*pを見ていれば、
5が10になった事がわかる。

const type a = 5;
const type *p = &a;

a2=a+5;
imutableだと*pからじゃ5が10に
なった事が判からない。
375デフォルトの名無しさん:2011/06/25(土) 18:53:31.96
376デフォルトの名無しさん:2011/06/25(土) 19:23:37.92
>>368
オブジェクトがすべてリスト構造に変換出来るんであれば
ある程度緩和できる話しだけどね。
377デフォルトの名無しさん:2011/06/25(土) 19:25:23.35
>>373
オブジェクトそのものが変化するならそのオブジェクトはmutableだし参照元は何もしなくても良いだろ
>>374の例を見ればやっぱり変数の束縛先の変化の事を指してるのかな
immutableオブジェクトの例としてconstを使うのはどうかと思うが
378デフォルトの名無しさん:2011/06/25(土) 19:26:01.95
>>376
リストにappendしたり、中の要素を変更したりするだけで
リストの全コピーが発生するのが困るんだが

リスト構造だと何が緩和されるの?
379デフォルトの名無しさん:2011/06/25(土) 19:32:44.39
cons的な操作が出来ればってことじゃね?
380デフォルトの名無しさん:2011/06/25(土) 19:44:28.49
C++のconstは次のように解釈してた
const type x = ... # immutable object
const type &x = .. # read only reference
381デフォルトの名無しさん:2011/06/25(土) 20:04:09.85
>>378
変更後のオブジェクトは変更したメンバーだけ持って、
変更前のメンバーは前のオブジェクト参照すればいいでしょ。
382デフォルトの名無しさん:2011/06/25(土) 20:28:29.53
>>381
だからリストのコピーが発生してるじゃん
383デフォルトの名無しさん:2011/06/25(土) 21:19:06.65
静的言語厨はSQLもコンパイル時にチェックしてるんだよな?
コンパイル時に型チェックできないならSQL使わないんだよな?
384デフォルトの名無しさん:2011/06/25(土) 21:29:17.35
>>383
ストアド使うか、カプセル化してチェックするっていうのは基本だが。
385デフォルトの名無しさん:2011/06/25(土) 21:32:21.36
SQLでコンパイルというのが全く持って曖昧だと気がつかないのか。
SQL文のプリコンパイルの事を言っているのか、静的言語からSQLを
呼び出すときのことを入っているのかはっきりしてくれ。

そもそもコンパイル時に型チェック出来ないなら使わないなんて誰が
言ったんだ? 勝手に話を面白くするな。
JavaもC++もRTTIはそれなりに使うぞ?
386デフォルトの名無しさん:2011/06/25(土) 21:38:19.06
つまり安全ではない、と
387デフォルトの名無しさん:2011/06/25(土) 21:40:46.89
たとえば同じバグがあったとして
1.テストを書かないと、バグがあることがわからない。
2.テストを書かなくても、バグがあることが分かる。
この二つの状態。

2の方が優れているのは言うまでもない。
388デフォルトの名無しさん:2011/06/25(土) 21:45:40.20
>>386
SQLに限らずホスト言語と組み込み言語の間の型マッピングは手動の
事が多いから、そりゃコンパイラで捕らえられないマッピング間違い
もあるだろうさ。

で、それがどうかしたの?
何のためのテストだと思っている?
389デフォルトの名無しさん:2011/06/25(土) 21:46:59.71
80できないから10でも同じ!
390デフォルトの名無しさん:2011/06/25(土) 21:52:01.38
SQLか。

テーブルのスキーマを変えたとき、たとえば
フィールドの型を変えたり項目を減らしたりしたとき、
そのフィールドを参照しているコードを
検出できたらいいとは思うよね。
391デフォルトの名無しさん:2011/06/25(土) 21:52:40.01
>>387
バグの種類によるだろ
392デフォルトの名無しさん:2011/06/25(土) 21:53:26.69
というかSQLは動的言語とのたまった御仁にどう動的言語なのか説明を
求めるも、「動的SQL」云々と口走った以外は音沙汰無しなのだが。
どこに行った?
393デフォルトの名無しさん:2011/06/25(土) 21:56:08.37
>>387
でも結局テスト書くよね?
静的だろうが動的だろうが。
394デフォルトの名無しさん:2011/06/25(土) 21:56:53.83
http://msdn.microsoft.com/ja-jp/library/1t3y8s4s(v=vs.80).aspx

null 許容型 (C# プログラミング ガイド)

null 許容型は、System.Nullable 構造体のインスタンスです。
null 許容型は、基礎となる値型の通常範囲の値だけでなく、null 値も表すことができます。

たとえば、Nullable<Int32> ("Int32 の Null 許容" と読みます) には、-2147483648 から
2147483647 の任意の値、または null 値を割り当てることができます。

Nullable<bool> には、true、false、または null の値を割り当てることができます。
数値型と Boolean 型に null を割り当てる機能が便利なのは、値を割り当てることができない
要素を含むデータベースや他のデータ型を処理するときです。

たとえば、データベースの Boolean フィールドには、値 true または false を格納するか、未定義にすることが可能です。
395デフォルトの名無しさん:2011/06/25(土) 21:58:41.70
>>393
> でも結局テスト書くよね?
> 静的だろうが動的だろうが。

まさか屁理屈いおうとしてないか?

テストにはいろんな種類があって、
そのうちの型チェックに関する部分のテストは
静的言語では書きません。

お前は、それ以外のテストを書くから
テストは必要だという、屁理屈に
つなげようとしていると見た。
396デフォルトの名無しさん:2011/06/25(土) 22:02:39.47
>>390
一つの言語内の問題ではなく異なる言語間のブリッジの問題だからね。
ぶっちゃげ静的動的はあまり関係ない。

データマッピングを間違えたところで静的型付けだとデータ変換時に
例外吐くのが動的型の場合はその後のロジックでエラーを引き起こす、
その程度の違いでしょ。
397デフォルトの名無しさん:2011/06/25(土) 22:25:42.60
> 動的型の場合はその後のロジックでエラーを引き起こす、
> その程度の違いでしょ。

それが怖いんだよ。
その後のロジックでエラーを引き起こすということは、
エラーを引き起こすロジックを実行しない限り
エラーがあることが分からないってこと。

こんな状態は想定外でしたという
システムトラブルの記者会見はこうやって起こる。
398デフォルトの名無しさん:2011/06/25(土) 22:30:04.19
>>382
function Example()
{
this.instance = {};
}

Example.prototype.Reference(field)
{
if( null != this[field] ) return this[field][field];
for(var original = this.original; null != original; original = original.original )
{
if( null != original[field] )
{
this.instance[field] = original[field][field];
break;
}
}
this[field] = this.instance;
return this[field][field];
}
こういう感じ。objectを内部的に変更するから、
厳密にimutableじゃないけど、objectの外から見る限りは完全にimutable。
ちなみにjavascriptに限らず大抵の言語は同じようにできる。
399デフォルトの名無しさん:2011/06/25(土) 22:33:13.14
そんなめんどくさいことまでして
やりたくない。

引数、もしくは関数にconstって付けたら
この関数を実行しても
この引数、オブジェクトは状態を変えません。

変えようとするコードを書いたら
コンパイルエラーになります。

って方が何倍もよい。
400デフォルトの名無しさん:2011/06/25(土) 22:35:42.33
>>399
関数型言語ですね
401デフォルトの名無しさん:2011/06/25(土) 22:43:31.58
>>396
いや動的型付けだろうと型変換に失敗したら例外吐くぞ
まさか動的型だと変換すらしないと思ってる?
402デフォルトの名無しさん:2011/06/25(土) 23:03:48.18
>>399
如何にコピーコストを抑えるかっていう、それとは別問題の事を書いたんだけど。
403デフォルトの名無しさん:2011/06/25(土) 23:07:54.69
>>385
C++でRTTI使いまくるのは設計がダサい証拠、って俺の師匠が言ってた
404デフォルトの名無しさん:2011/06/25(土) 23:10:23.21
>>401
動的言語でも型変換はするでしょ。ただJDBCやDBIなどの低水準のDB接続APIに
関して、動的言語の場合はAPIの実装が結果テーブルのメタデータ読んで自動的に
適切な型変換をするので、APIを叩く利用者側ではカラム値を引っ張ってくるのに
特に型指定する必要が無い場合が多いよね。型指定しなくても常に成功する。

静的言語の場合は多くはgetStringみたいに型指定されたメソッドを叩く必要が
あるし、正しいメソッドを利用しないとカラム値を引っ張った時点で例外を吐く。

動的言語ではノーエラーでカラム値を引っ張れるとしてもそれが想定した型の値
でないと後のロジックで破綻するから、結局静的型と同様に型の検証とかDAOの
テストを書いたりする必要がある。

要するにSQLとかDBアクセスが安全か否かに関して静的動的云々はあまり関係
が無くて、結局テストを書かないといけないという事。
405デフォルトの名無しさん:2011/06/25(土) 23:20:43.09
スクラッチからかくならC++にRTTIとfriendはいらない
406デフォルトの名無しさん:2011/06/25(土) 23:28:56.26
静的言語でSQL書くなら、埋め込みSQL使えばいいだろうに。
ちゃんと型チェックしてくれるぞ。
407デフォルトの名無しさん:2011/06/25(土) 23:34:04.38
SQLJとか死に体だからなぁ・・・
408デフォルトの名無しさん:2011/06/25(土) 23:35:51.98
>>395
いや、それだけの話なら、正しいスレタイは
「動的言語は型チェックのテストコードを書くから面倒」
じゃないかなと。
409デフォルトの名無しさん:2011/06/25(土) 23:37:44.68
>>404
> 結局テストを書かないといけないという事。

うん、結局という話にするから
おかしくなっちゃうんだよ。

飛行機で行っても、船で行っても
結局、アメリカにつくだろう?

結局、アメリカにつくから同じだと思うか?

問題は結局という最終的な結果じゃなくて
そこに辿りつくまでの話よ。
同じ結果になるのなら、楽な方がいいだろう?
問題は早く見つかるほうが楽だよ。
410デフォルトの名無しさん:2011/06/25(土) 23:44:58.34
>>404
それってAPIの問題な希ガス
411デフォルトの名無しさん:2011/06/26(日) 00:01:09.73
>>409
あ〜基本的に自分は>>383とか>>386をピンポイントでdisりたいので
あって静的言語を叩いたり動的言語を持ち上げたりその逆をしたりする
意図はないから。

ただSQLの呼び出しに関連した問題は本質的には異なる言語とのブリッジ
にまつわる問題であって静的動的云々の言語の違いはそれと比べれば副次
的なものだと考えている。

>>410
うん。APIの問題なんだよ。言語はあまり関係ない。

内部で型変換するAPIが多い動的言語もユーザが型指定する必要のあるAPI
が多い静的言語でも発生箇所が異なるだけで問題は結局発生するのだから
(繰り返すけど言語ブリッジの問題だから)、静的動的云々は安全性の問題
にはあまり関係がないと思う。

静的型にしても例えば文字列型のカラム値をgetDoubleで取りに行って
例外を吐くかは実行時にしか解らないわけで、結局テストを書くしかない。
412デフォルトの名無しさん:2011/06/26(日) 00:22:46.21
>>411
■スキーマの検証

 モデル・クラスがLINQ to SQLデザイナを使用して定義されたとき、
データモデル・クラスにあるプロパティのデータ型は、
そのデータベース・テーブルのデータ型に対応します。

例えば、もしDinnersテーブルの“EventDate”列が“datetime”の場合、
LINQ to SQLが作成したそのデータモデル・クラスは“DateTime”
(これはビルドインの.NETデータ型です)に型付けされます。
つまり、それに対してコードからint型やbool型を割り当てようとした場合には
コンパイル・エラーになり、実行時に無効なstring型をそれに明示的に変換しようとした場合には、自動的にエラーが発生します。
^^^^^^^^^^^^^^^^^^^^^^^^
413デフォルトの名無しさん:2011/06/26(日) 00:36:39.11
>>412
それは静的言語が偉いと言うよりもまずO/Rマッパが偉いんだと思うw
テーブルスキーマとデータクラス等々の定義を自動で同期するんだよね。

ただデータクラスに正しくマッピングされれば後は静的言語の型検証を
有効に活用できるというわけで、確かに静的型の方が有利だな。
414uy ◆yyC0rYWEq2 :2011/06/26(日) 01:01:21.81
>>365
へえ
Rubyにはconstにかわるものがないと思ってるのか
レベルひく・・・
415デフォルトの名無しさん:2011/06/26(日) 01:22:49.02
>>414
rubyはもういいよw
選択肢外だから話題に出さないで
邪魔くさい
416uy ◆yyC0rYWEq2 :2011/06/26(日) 01:26:58.51
>>415
http://glossary.tank.jp/t0823.html
この人がさ
2000年の時点でこれ言ってんだよね

残念だけど2011年になって、外国からの書籍も日本も来るようになっても、

お前みたいなおばかはいるみたいで。。。
417デフォルトの名無しさん:2011/06/26(日) 01:28:59.02
んなこと言われてもどうでもいいもんはどうでもいい(笑)
418uy ◆yyC0rYWEq2 :2011/06/26(日) 01:30:04.37
>>415
で、選択肢は何をもってんだ?

Rubyと同等に見れる可能性のある言語って、Python,Lispくらいなんだけど
まさかPerlとかゴミHaskellをだしてくるわけじゃないだろうな
PythonとLispはそのどちらも、日本語資料がとぼしく、一部の奴が好んで使ってるだけで
特に大学でPythonなんて教えてるとこよりはRuby教えてるところのほうが多いと思うが

動的言語でRubyという選択肢を除外なんて、何をいっているのやら。知ったか君は邪魔だから 消えてくれ
419uy ◆yyC0rYWEq2 :2011/06/26(日) 01:30:48.19
>>417
そうだよね
お前には近いこなせないの知ってて言ってる(笑)

効率に気づけないんだから仕方ないよね
420デフォルトの名無しさん:2011/06/26(日) 01:32:39.23
この糞コテ、だんだん精神的にマズくなってんだろなって思う
421デフォルトの名無しさん:2011/06/26(日) 01:33:35.43
まあそうムキになるなよ(笑)
どうぞどうぞ、固執してなさい
でも邪魔くさいからrubyの話題を持ってくるのはやめてね
わかった?
422デフォルトの名無しさん:2011/06/26(日) 01:34:08.31
るびー
Ruby
【プログラミング】
・まつもとゆきひろ氏が開発している、日本生まれのオブジェクト指向スクリプト言語。
・その強力な機能と最初から日本語の資料が整っている事からすれば、生まれ故郷の日本ではもっと普及しても
良さそうなものだが、拝外思想の持ち主で遠く太平洋をはさんだアメリカばかりに気を囚われて、
足元で起こっている変化に気付かない多くの連中には、当分気付かれ、受け入れられそうも無いもの。
・「当分」が解けるのは、アメリカで「Ruby」の本が出版され、それが日本で翻訳される頃あたり;-p
2001/01/01更新


423デフォルトの名無しさん:2011/06/26(日) 01:35:20.63
>>420
かまってちゃんが攻撃的なのはよくあること
普通のこと
普通のかまってちゃんが普通の行動をとってるだけ
424uy ◆KOAgYBL/Xg :2011/06/26(日) 01:35:37.22
>>420
感がいいの?


>>421
おkwwwwwww っじゃwwお前は一生Ruby使うなwwwwwww 絶対に使うなよ?
使ったらお前の「負け」でwwwwwwwwwwwwwwwwwwwww


使うなよ?

人が親切心でおしえてんのにねw
425デフォルトの名無しさん:2011/06/26(日) 01:35:46.64
何故ここでコレを出したのか未だに理解できない
426デフォルトの名無しさん:2011/06/26(日) 01:37:01.44
>>422
そんなもん持ち出さなくても、rubyは十分に普及してるじゃん
ゴミの割にはよくやってるよ
427デフォルトの名無しさん:2011/06/26(日) 01:37:28.31
>PythonとLispはそのどちらも、日本語資料がとぼしく
428デフォルトの名無しさん:2011/06/26(日) 01:37:56.79
>>424
なんだ、ただのガキか
429デフォルトの名無しさん:2011/06/26(日) 01:39:44.92
日本語しか読めない奴には、日本語の資料が充実してるかどうかが死活問題だからな
英語読めないなんて軽蔑するけど、まあ馬鹿にもプログラミングする権利はあるしな
430uy ◆KOAgYBL/Xg :2011/06/26(日) 01:43:43.71
>>428
ゴミ乙


>>429
まだそのフィールドにいるんだ
じゃあお前なんでこの板にいるわけ? 英語が読めるんだったら海外bbsいってろハゲ

在日ではなく日本人だったら日本語が読みやすいのは当たり前なんすけどーwwwwwwwwwwwwwwww
読めるか読めないかじゃなくて
学習速度のこといってんだわwwwwwwwwwwwwwwww
学校の教科書を全部英語でかかれてんのとお、www 日本語でかかれ店のどっちがいいですかあああ??w?Ww?Www
431デフォルトの名無しさん:2011/06/26(日) 01:46:23.47
英語だろ?
432デフォルトの名無しさん:2011/06/26(日) 01:47:01.33
静的な型に対する最も一般的な反対論は、プログラムを無駄に長くして、プログラマーが自分の思考を表現するうえで妨げになること、
そしてソフトウェアシステムのある種のダイナミックな変更のパターンが不可能になることである。
しかし、こういった議論は、冗長で柔軟性が低いと感じられる特定の型システムに対する反対にしかなっておらず、
静的な型付けという一般的な思想に反対するものにはなっていない。

たとえば、Smalltalkの発明者であるAlan Kayは、こう言ったことがある。
「私は型に反対しているわけではない。『完全な苦痛』にはならないような型システムを見たことが無いので、
動的な型付けを支持しているのである」
433uy ◆KOAgYBL/Xg :2011/06/26(日) 01:47:37.08
>>431
だから
だから
【現象】
・おそらく、海馬がイカれていて記憶を留める事ができない上に、前頭葉と側頭葉が魚並みに退化してしまった人種なんだろうけれど、それを差し引いたとしても込み上げて来る感情を我慢できずに吐き出してしまう言葉。
・今日もどこかで聞こえる怒りの声。 「だぁ〜かぁ〜らぁ〜(怒)」
http://glossary.tank.jp/t0629.html

だからさぁ 、、 そうかそれなら国へ帰れ
434デフォルトの名無しさん:2011/06/26(日) 01:48:34.94
>>430
日本語のほうが読みやすい?
他に選択肢ないくせに、なにが日本語の「ほうが」だよww
435デフォルトの名無しさん:2011/06/26(日) 01:50:26.97
この出会い厨、今日はやたらと元気だな

436デフォルトの名無しさん:2011/06/26(日) 01:51:15.95
フランス語はフランス人しか喋らないと思ってるのか
437デフォルトの名無しさん:2011/06/26(日) 01:52:15.63
静的型システムは単純なエラーを検出できるだけだが、
「単体テストならもっと広い範囲のエラーを検出できるのだから、
わざわざ静的型システムを使う必要は無い」とまでいう人々もいる。

私たちは、このような議論には見落としがあると思う。
確かに、静的型システムは単体テストの代わりになるわけではないが、
プログラムの性質を確認するために普通なら必要だった単体テストの数を減らしてくれる。

さらに、単体テストは静的型付けの代わりにはならない。
エドガー・ダイクストラが言ったように、テストが証明できるのはエラーの存在であって、
エラーの不在ではない。静的型付けが与えてくれる保証は単純なものかもしれないが、
どれだけテストをしたとしても得られない本物の保証なのである。
438デフォルトの名無しさん:2011/06/26(日) 01:55:19.95
>>430
日本語が不自由なやつだな
439デフォルトの名無しさん:2011/06/26(日) 02:00:42.89
>>432
> 静的な型に対する最も一般的な反対論は、プログラムを無駄に長くして、プログラマーが自分の思考を表現するうえで妨げになること、
それはお前の思い込みでしか無いよ。
440デフォルトの名無しさん:2011/06/26(日) 02:01:26.34
ぶっちゃけ、型を定義する程度の簡単なことを
めんどくさいと言ってやらないやつは
テストもめんどくさいと言ってやらないんだろう。
441デフォルトの名無しさん:2011/06/26(日) 02:02:43.37
急がば回れ。

型書いとくと
あとで楽になる。

日本にはいいことわざがあるよ。
442uy ◆KOAgYBL/Xg :2011/06/26(日) 02:03:42.32
>>434
はっああァァアアアアアアァァ?????????????????

railsとか、日本語だとおもってんの?wwwwww
ocraとか英語ドキュメントしかないけど、俺はその英語ヘルプ読んで使えるようになったんですけどぉぉwwwww
Rubyは日本語資料も多くwww英語資料も多いんだよwwwwwwwww両方wwwwwwwwwwwwwwwwwwwwwwwwwwwww
443デフォルトの名無しさん:2011/06/26(日) 02:04:25.57
>>440
本心が透けて見えてるよ
444デフォルトの名無しさん:2011/06/26(日) 02:09:21.65
てか基地外は放置しろよ。
まぁ、似たような基地外が立てたこのスレで言うのも何だけど。
445デフォルトの名無しさん:2011/06/26(日) 02:10:29.80
誰からも認証されないかわいそうなおっさん
446uy ◆KOAgYBL/Xg :2011/06/26(日) 02:11:18.45
>>443
たったの3行に
めんどくさい をって単語が2個もヒットしたね。

p"ぶっちゃけ、型を定義する程度の簡単なことを
めんどくさいと言ってやらないやつは
テストもめんどくさいと言ってやらないんだろう。
".scan(/めんどくさい/).size

# => 2
447デフォルトの名無しさん:2011/06/26(日) 02:16:17.40
反論できない時の模範的な解答例。>>446
448デフォルトの名無しさん:2011/06/26(日) 02:30:13.90
型宣言の手間に費やす労力は代わりにIDEの補完機能の精度向上によって十分に
報われている気がする。動的言語向けのIDEも頑張ってはいるけれども、やはり
補完の精度では型情報を使って候補を絞り込める静的言語には敵わない。
他にも最近のIDEは型の妥当性をコーディング時にリアルタイムで検証するから、
間違った型への代入等々はそれこそビルド"前"にエラーとして警告される。
これもポカよけとして非常に有用。

ActionScriptなんかは動的型のAS2からAS3に移行するに当たって静的型を、
それも動的型も併用可能という形で導入したのだけれども結局はあっという間に
型付きでのコーディングが多数派となった。
そんなに動的型が本質的に優れているのであれば開発者の多数は動的型での開発
に留まったと思うのだけれども当時のFlexBuilderとか使っていれば型付きでの
コーディングの効率の良さは明らかだったからね。
静的型を導入してもそのデメリットは十分に補うことが出来るという良い事例。
449デフォルトの名無しさん:2011/06/26(日) 02:32:34.43
型があったほうが楽にならない?
コード補完してくれるし
正しい位置にジャンプしてくれるし。

コード書いているときに思考を邪魔されたくないから
適当な変数名付けることってない?

俺その場ですぐに適切な変数名ってつけられないんだよね。
だって俺の思考はすでにもっと先のコードを書いているから。
450デフォルトの名無しさん:2011/06/26(日) 02:37:48.08
>>448
グラフィック中心のFLASH使いは動的な書き方が多いけど
FlashDevelop使うような連中はJava風な書き方になってるね
451uy ◆KOAgYBL/Xg :2011/06/26(日) 02:38:03.18
>>447
はぁ?




型については、
まともなリファクタリングしたことあればわかると思うけど
一度つくった設計そのものをかえるようになりファクタリングするときって
静的言語じゃ絶望的だぞ
引数、戻り値、をそれぞれかえるのと他に、 型情報までかきかえなきゃならなくなるんだから

小規模ならまだしも、
もし大規模なプログラムで根幹からちょっと仕様変更しなくちゃならなくなったときは
下手に設計していると頓挫して空中分解
そういうところから炎上やデスマになってると思うんだよね
452デフォルトの名無しさん:2011/06/26(日) 02:42:47.30
どれが一番権威のある本?

リファクタリング―プログラムの体質改善テクニック
http://www.amazon.co.jp/dp/4894712288/
マーチン ファウラー

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法
http://www.amazon.co.jp/dp/4873114039/
オライリー

Java言語で学ぶリファクタリング入門
http://www.amazon.co.jp/dp/4797337990/
結城 浩
453デフォルトの名無しさん:2011/06/26(日) 02:44:40.88
>>451
これははずかしい
454デフォルトの名無しさん:2011/06/26(日) 02:46:55.32
だがどこが恥ずかしいかは言えない。本当に恥ずかしいやつめ。
455デフォルトの名無しさん:2011/06/26(日) 02:52:11.21
え?
456デフォルトの名無しさん:2011/06/26(日) 02:52:14.36
>>451
はぁ?

最近のIDEでまともなリファクタリングをしたことがあるなら判ると思うけど、
抽象クラスのメソッドシグネチャを書き換えると具象クラスのそれも自動的に
書き換えたりと、レキシカルに特定出来るところは自動的に書き換えるのは
普通だし、書き換えの副作用の範囲が即座に型エラー等として見て取れる
あたりはより「安全」だぞ。

動的型の場合「根幹からちょっと仕様変更」したときにその副作用の範囲を
どう特定するのか是非ノウハウを聞かせてもらいたいものだ。
457デフォルトの名無しさん:2011/06/26(日) 02:52:22.07
根底からリファクタリングするって事自体があり得んよなぁ。
それぐらいだったら、元のコードの横に(レイヤー的に)増設したほうがましだ。
458デフォルトの名無しさん:2011/06/26(日) 02:53:23.81
え?
459デフォルトの名無しさん:2011/06/26(日) 02:54:38.44
増設に増設を重ね。そしてしまいに崩れる。
それをどうにかする方法はないか。

そこからリファクタリングという技術が
生まれたことを知らないのか?

>>457
お前はまだ、リファクタリングの入り口にすら
たどり着いていない。
460デフォルトの名無しさん:2011/06/26(日) 03:01:00.53
現実見ろよ。
あと、多分勘違いされてると思う。俺の方は、標準ライブラリに依存した
箇所さえ動作を変えるような方法だ。
そもそもあなたのリファクタリングは、何のためのリファクタリング?
461デフォルトの名無しさん:2011/06/26(日) 03:02:46.19
>標準ライブラリに依存した箇所さえ動作を変えるような方法だ。

具体例。
462デフォルトの名無しさん:2011/06/26(日) 03:06:03.52
仕様を変えるのはリファクタリングと言わない。
正しくリファクタリングなのであれば、
普通テストを書いているので型エラー以外も含めて特定可能。
463デフォルトの名無しさん:2011/06/26(日) 03:06:17.72
>>460
なんのためのリファクタリングかって?
それ、リファクタリングの本の最初の方に答えが書いてあるよ。

Java言語で学ぶリファクタリング入門より

リファクタリングの目的

「バグとり」や「機能追加」はリファクタリングではありません。
それではリファクタリングの目的はなんでしょうか?
 リファクタリングには次のような目的があります

◆バグを見つけやすくする
「バグとり」その者はリファクタリングではありません。しかし、リファクタリングを行うと
プログラムが整理され、潜んでいるバグを見つけやすくなります。


◆機能追加しやすくする
「機能追加」そのものはリファクタリングではありません。しかしリファクタリングを行うと
プログラムに新しい機能を追加しやすくなりますs。


◆レビューしやすくする
464デフォルトの名無しさん:2011/06/26(日) 03:06:23.64
>>460
>そもそもあなたのリファクタリングは、何のためのリファクタリング?

「現在の実装の振る舞いを変えずに」コードの可読性保守性を上げたり
パフォーマンスを上げるためにコードを書き換えること。
リファクタリングとはそういうものだと思うが違うの?
465デフォルトの名無しさん:2011/06/26(日) 03:06:57.68
つうか型エラーの話ばかりするけど、
それさえチェックされれば満足なのかよと言いたいが。
466uy ◆KOAgYBL/Xg :2011/06/26(日) 03:09:10.91
>>456
はぁ?Ww
その程度で出来るものをリファクタリングとはいいませんから^^^^^^^^^
467デフォルトの名無しさん:2011/06/26(日) 03:12:00.89
>>462
リファクタリングを行うために
「テストを書く」という準備をする必要がある。それも正しいけど、
「型をちゃんと書く」という準備をすることも正しいよ。

テストだけが、リファクタリングで動作に変化が起きていないことを
証明する方法じゃないということ。
コンパイラ・IDEの力を借りて自動的に行うこともできる。

テストはテストから漏れている部分、つまりバグがある箇所は
特定不可能だからね。
468デフォルトの名無しさん:2011/06/26(日) 03:13:05.65
>>466
お前の俺俺定義はどうでもいいよ。

リファクタリングの本に、なにがリファクタリングかはちゃんと書いてあるから。
469uy ◆KOAgYBL/Xg :2011/06/26(日) 03:14:24.94
>>468
おまえ、すっげーゴミ本読んでるんだな

著者だれの本読んだ?w

できればその著者のかいたソースコードも乗せてくれよ
リファクタリングほど個人差の出るものねーから
470デフォルトの名無しさん:2011/06/26(日) 03:14:43.59
一番権威があるリファクタリングカタログw

http://www.refactoring.com/catalog/index.html

この中に含まれているものは
リファクタリングです。
471デフォルトの名無しさん:2011/06/26(日) 03:14:49.99
 状況によって変わる。よくある方法は新しく作ったインターフェースに、
修正対象部分の動作を合わせていく。
そして、新しいクラス群は、修正対象をAdapterに隔離し、
修正対象から依存性を切り離す。
インターフェース的には古いクラスの中に介入できるので、
古いクラスの動作も改善できる。

要するに関数型な考え。で、あなたのリファクタリングは根本的に変えるんだよね何がしたいの?

class XxxxxAdapter implments RefactorInterface
{
private OldType oldType;
public XxxxxAdapter(略) {略}
public Type Yyyyy(NewType xxxx)
{
return oldType.Yyyyy( convert(xxxxx) );
}
}
472デフォルトの名無しさん:2011/06/26(日) 03:15:15.06
>>465
何で動的厨は勝手に話を膨らませて面白おかしくするんだ。
誰が「型エラーさえチェックされれば満足」なんて言った?
誰もそんなことは言っとらん。

>>466
お前もだ。誰が「これでだけで出来る」なんて言った?

リファクタリングの基本はあくまでテストで、IDEの自動書き換えも型エラーも
リファクタリングをサポートする「便利機能」に過ぎないよ。
しかし動的言語ではこれらの「便利機能」の実装すらかなりプアな状況にあると
いうのが俺の認識なんだが、違う?
473デフォルトの名無しさん:2011/06/26(日) 03:15:28.66
>>469
英語だよ。大丈夫?
http://www.refactoring.com/
474uy ◆KOAgYBL/Xg :2011/06/26(日) 03:21:17.10
>>473
ソースコードのリンクを載せろ
それ以外は読まない

bifoar

after

ってリファクタリング本なら、あるだろ
もしないならゴミ本決定
475デフォルトの名無しさん:2011/06/26(日) 03:21:45.96
>>466
そもそもお前自身がメソッドシグネチャの書き換え程度の話しか出して
いないだろw 自分で>>451を読み返せ。
他人を笑う前に自分の後出しジャンケンを笑えよw
476デフォルトの名無しさん:2011/06/26(日) 03:22:46.28
◆バグを見つけやすくする
「バグとり」その者はリファクタリングではありません。しかし、リファクタリングを行うと
プログラムが整理され、潜んでいるバグを見つけやすくなります。


◆機能追加しやすくする
「機能追加」そのものはリファクタリングではありません。しかしリファクタリングを行うと
プログラムに新しい機能を追加しやすくなりますs。


そうだろ。やりたいのはコレだろ。でも現実問題、自社のライブラリやら、社外のライブラリを
直接いじる事はできないんだ。だから、変更したい箇所にAdapterやらBridgeを噛ませて動作を整えるしかないんだ。
現状、自分で修正可能なプロジェクトの範囲なら、リファクタリングツールで十分だけどな。
477uy ◆KOAgYBL/Xg :2011/06/26(日) 03:23:39.03
>>475
はっああぁlっぁアァァアアアアア??????????????????
根底からって言ってるのにどうよんだらそうなるわけ?
勝手に俺のレスのいいたことを読み間違えてる分際で?
死ねおyゴミんm
478デフォルトの名無しさん:2011/06/26(日) 03:25:09.93
>>452
そういうのは真ん中のを一番下に持ってこなきゃ
479デフォルトの名無しさん:2011/06/26(日) 03:25:50.73
>>474
"bifoar"って思わずググってしまったじゃないか。笑わせんなw

とりあえずuy ◆KOAgYBL/Xgは英語も読み書きできず豊富なUML図を
用いた説明も読んで理解出来ないという事はよく解った。
480デフォルトの名無しさん:2011/06/26(日) 03:27:21.17
>>477
だから「根底」の例を出せよ。具体例を。
基底クラスのメソッドシグネチャ書き換えかw
481デフォルトの名無しさん:2011/06/26(日) 03:29:28.07
リファクタリングとは人間がやるものだ。
機械にやらせるもんじゃない。



アセンブラも同じだ。
ハンドアセンブル最高!
482デフォルトの名無しさん:2011/06/26(日) 03:31:13.72
>>472
だって型チェックの話ばかりじゃん。
動的型言語では型チェックを一々テストでも書かないよ。考え方が違うから。
特定のクラスのインスタンスを渡さないと動かないことを強制するんじゃなくて、特定の振る舞いを持つなら良しとする。
パターンやGenericsを駆使しなくても、その言語の普通の書き方で十分な拡張性や柔軟性がある。
自分の足を打ち抜くのが怖い人はJava使ってれば良い。
483デフォルトの名無しさん:2011/06/26(日) 03:31:52.87
>>476
> 直接いじる事はできないんだ。だから、変更したい箇所にAdapterやらBridgeを噛ませて動作を整えるしかないんだ。

そのAdapterやらBridgeを半自動で
作成してくれるんだよ。Eclipse+Javaは。

これはリファクタリングではないが、静的言語ならではの
コンパイラのコード理解力
484デフォルトの名無しさん:2011/06/26(日) 03:33:00.22
要は使ったこともないのにはったりで騙ってるってことだね
485デフォルトの名無しさん:2011/06/26(日) 03:34:46.17
>>483
別に、静的がいいだの、動的がいいだの俺は書いてないんだけどな。
486uy ◆KOAgYBL/Xg :2011/06/26(日) 03:35:20.97
だから、大規模なプログラムの静的言語って

A構造体の引数をとって、A構造体を返す。 みたいな関数が多くなってくるとおもうんだけど
あれって結局、型をなくしたいんだよ
仕様変更に強くする為には、そうするしかない
第一引数にint 第二引数にstring 第三引数に... っていう感じじゃなくて

構造体.int =5
構造体.string ="aa

function( 構造体 ) ;

こう。


あと、Rubyだとハッシュ引数というのがあって
function({ :int => 5 , :string => "aa" })
こういうのをやってる

こういう手法が、良いとされるって事は、もう結論出ちゃってるじゃん・・・、
動的言語はこの手のことをすべての箇所でやれるが、
静的言語は、ライブラリやロジックのすべての箇所でやるのは無謀
結局、普通にfunction( 1, "aa" , :test ); ってな具合に引数を渡してる関数も出てくるわけで

 そ こ が リファクタリングの為に要する時間を増やすことになる
487uy ◆KOAgYBL/Xg :2011/06/26(日) 03:36:52.89
>>480
へえぇ?? まずそっからなんかwwwwwwwwwwwwww

Aプログラムを納品し、似たような機能のBプログラムを作らなくちゃならなくなったとき

Aプログラムの設計はもうズタズタだから、最初から書き換えましょう とかそういう場面だよ
488デフォルトの名無しさん:2011/06/26(日) 03:37:36.77
> A構造体の引数をとって、A構造体を返す。 みたいな関数が多くなってくるとおもうんだけど
> あれって結局、型をなくしたいんだよ

いや、単に「引数オブジェクトの導入」という
リファクタリングを実践しているだけ。
489uy ◆KOAgYBL/Xg :2011/06/26(日) 03:38:41.19
>>479
だからねぇ・・・リファクタリングって、個人の能力が如実に表れるものであって、

おまえにとってその本が良書でも、万人にとってはそうではなく
その著者よりもレベルの高いリファクタリングが可能なやつはごまんといるわけだ
よくそんな「ゴミ本よんでます」なんて公言できますね、
多分おまえ、一定レベルの技術者からは覚めた眼で見られているタイプ、
一定レベル以下の初心者からは、先生(笑)とかってよばれるかもなw 最初の1年だけ・・・
490デフォルトの名無しさん:2011/06/26(日) 03:41:54.77
> だからねぇ・・・リファクタリングって、個人の能力が如実に表れるものであって、

個人の能力が現れないものがあったら教えてくれ(大爆笑w

491デフォルトの名無しさん:2011/06/26(日) 03:42:32.18
>>484
Java + Eclipseしか使ったことは無いの?
3Dデータ変換から、音声生成、マルチメディアとWebシステムとの接続とか
そういう環境じゃ、言語がどうの環境がどうのとか些細すぎてどうでもいい。
言語や環境にとらわれず、どの状況でも応用効かせられる方法をもたなきゃやってられん。
492uy ◆KOAgYBL/Xg :2011/06/26(日) 03:42:43.12
>>488
何同じこといってんの?
たとえばRuby処理系にしてみれば VALUEって構造体がそれにあたる
静的言語だから、ああいういろんな場所で使う共通の構造体を作る( しかない。 )
動的言語だと、そのVALUEの定義すら省く

あとそんな当たり前のやり方にたいし「引数オブジェクトの導入」 とかリファクタリングとかいわれてもこまるwwwwww
あの程度、最初の設計段階でかけていなければならないものであって、リファクタリングしてない
493デフォルトの名無しさん:2011/06/26(日) 03:43:32.54
>>482
>だって型チェックの話ばかりじゃん。
〜〜〜〜〜〜〜〜〜 深 い 谷 〜〜〜〜〜〜〜〜〜〜〜
>それさえチェックされれば満足なのかよと言いたいが。

この二つの間の論理の飛躍、というか決めつけに気がつかないのであれば
もう何も言うことはない。型の話が多いのは認めるけど、それだけで満足
しているかはまた別問題だろう。

あと静的な型チェックの話は静的言語にあって動的言語には無いメリット
だから、静的厨にとっては話しやすいネタなんだよな。
他の差異、例えばより柔軟なリフレクションやevalの類などは動的言語に
あって静的言語には無いものだから、動的側から話を振ればよい。

> 自分の足を打ち抜くのが怖い人はJava使ってれば良い

自分は怖い人だからそうするわ。
ただ俺が作った銃で他人様が足を打ち抜く例もあるわけで。
494デフォルトの名無しさん:2011/06/26(日) 03:44:59.39
やっぱりな。

リファクタリングを分かってない。

本当にすごい物ってのは、
基本なんだよ。なんでもそうだ。
495uy ◆KOAgYBL/Xg :2011/06/26(日) 03:49:05.31
>>490
如実の意味でもググってきたら?
文章よめないのか? あー日本語よめねーのか、なるほどな
日本語コンプレックスのせいで英語俺よめるぜ(キリ)みたいになってんだ(笑)

個人の能力があらわれないもの
そりゃ、おまえが普段かいてるコードそのものだよwwwwwwwwwwwwwwwwwwwwww
土方のかいてるソースコードに「 個人の能力 」なんて誤差の範囲なんだけどwwwwwwwwwwwwww
何かを勘違いしちゃっていたの???
496デフォルトの名無しさん:2011/06/26(日) 03:49:19.98
>>487
>Aプログラムの設計はもうズタズタだから、最初から書き換えましょう
>とかそういう場面だよ

それリファクタリングと違う。そもそもだな。

>>451
>もし大規模なプログラムで根幹からちょっと仕様変更しなくちゃならなくなったときは

元々言っていたことと全然話が変わっているだろう。
497デフォルトの名無しさん:2011/06/26(日) 03:51:10.67
>>496
ほっとけよ精神薄弱者なんだから。
498デフォルトの名無しさん:2011/06/26(日) 03:54:30.30
>>495
> 個人の能力があらわれないもの
> そりゃ、おまえが普段かいてるコードそのものだよwwwwwwwwwwwwwwwwwwwwww

コードこそ、個人の能力が一番現れるもんだろ。

その証拠にさっきお前もソースコード要求していただろ。
個人の能力がどうとかいって。
499uy ◆KOAgYBL/Xg :2011/06/26(日) 03:56:05.70
>>496
ハッァアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアアwwwwwwww?Wwwwwww
おまえ、マジでど素人だろ
プログラミングさえ満足にできない奴って生きてて恥ずかしくないの?????????ww


>>498
はぁあ??????
??WwW?W
俺が要求していたのはそのコードじゃないのでwwwwwさっきから脳内妄想激しすぎwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
500デフォルトの名無しさん:2011/06/26(日) 03:57:12.35
わかりやすいキチガイだな
501デフォルトの名無しさん:2011/06/26(日) 03:57:18.14
>>497
というか>>499を見る限り、精神薄弱を演出して逃げに入りましたな。
502デフォルトの名無しさん:2011/06/26(日) 03:57:24.76
こんなん書いてるアホだもん。リファクタリング以前だよ。

840 名前:uy ◆yyC0rYWEq2 []: 2011/06/18(土) 01:14:50.32
>>832
シーン介した場所ではup.up.up.なんて流石にやらない もっと細かい場所の事を言ってた
俺はシーンとゲーム内オブジェクトもいろいろと繋がってるから

こんな感じ
player_shot.sym # => :player_shot_002 ← 沢山作られるから適当な番号
player_shot.up.sym # => :player
player_shot.up.up.sym # => :scene_name

player_shot.x でプレイヤーショットのx座標
player_shot.up.x でプレイヤーのx座標取得
player_shot.up.up.hensuu で、シーンの共通変数、みたいな

勿論さっきかいたように.upを生で使ってたのは初期だけな

まぁこれは、プレイヤーショットの処理のところをかいてるときの、相対関係で、

シーンのところからプレイヤーショットのxを取得する例をかいていみると、、こうなる
scene.task[:player].search_down_all(/(player_shot_\d*)/).each do | key , value |
  value.x # => プレイヤーショットのx座標げっと
end
search_down_all関数っていうのは、自分の持ってるタスク以下の正規表現にマッチするシンボルのタスクを全部検索する感じの関数
503デフォルトの名無しさん:2011/06/26(日) 03:59:23.46
uy ◆yyC0rYWEq2を生暖かく眺めるスレとなりました。
504デフォルトの名無しさん:2011/06/26(日) 04:01:28.92
趣味グラマにはリファクタリングなんて縁がないからね。
全ソースコードは常に修正可能だし
もてる時間を全部つぎ込んで一から書き直してもモーマンタイw
505デフォルトの名無しさん:2011/06/26(日) 04:03:06.19
>>502
うむ。

コードは一番能力の差が出るところだな。
506デフォルトの名無しさん:2011/06/26(日) 04:07:21.10
>>502
 てか、静的動的云々語る前に、オプソのコード眺めるなりして、
コードの書き方勉強すべきじゃね?一部だけ観て全体を見れてないだろ。
507uy ◆KOAgYBL/Xg :2011/06/26(日) 04:07:52.65
>>502
それをだしてきたかww もっと貼っていいよそれ

わかる奴にはわかるソースコードのはずだから どんどん貼れ?


>>わかる奴へ
それをみてわかるように、俺はもうリファクタリングがどうのってフィールドにはいない
少し戯れをしているだけ
508デフォルトの名無しさん:2011/06/26(日) 04:11:32.48
みんな分かってる。

基地外が誰かを。

文句を言ったやつだ。
509デフォルトの名無しさん:2011/06/26(日) 04:13:00.22
>>507
自分からリファクタリングの話を振っておいて、気がついたら
自ら異次元に旅立ちおったwwwww

ではわかる奴の点呼をとろう。
uy ◆yyC0rYWEq2さんの理解者は挙手だ!
510デフォルトの名無しさん:2011/06/26(日) 04:13:32.19
はいはいはいはい。

ほらもう8人挙手した。
511デフォルトの名無しさん:2011/06/26(日) 04:23:00.73
>>470に示されたリファクタリングを忠実に実行するのは結構難しいな。
単一のコードならまだしも不適切な関連だらけだと修正が波及的に増大する。
ツールの補助がないと無理。
512uy ◆KOAgYBL/Xg :2011/06/26(日) 04:26:40.42
object.search_up(/(window_\d*)/).search_down_all(/(window_.*)/).each do | key , value |

object.search_up(/(window_\d*)/).up.delete

異次元だよ、 
こんな感じに、何やってるかわかんないと思うし
どうせ嫁やしねーんだろ、 
ちょっともう、リファクタラとかそういう場所にはいませんね  こういうコードおまえたちは書いてるの?かいていないんでしょ
はいはいしゅうりょしゅうりょう


object.window_template2({ sym: :test_win ,
 window:({ default:({ x: x , y: y , sym: :window , d: Image.new( w , h , [100,100,100] ) ,
  window:({ text:({ x: x + 10 , y: y +10 , sym: :window_text , d: Image.new( w - 20 , h - 20 , [10,20,20] ) , }) ,
   state: ({ x: x , y: y + h - 20 , sym: :window_state, d: Image.new( w , 20 , [80,120,180] ) , }) ,
   title: ({ x: x , y: y , sym: :window_title, d: Image.new( w , 20 , [80,170,180] ) ,
    window:({ close: ({ x: x -20 + w , y: y , sym: :window_title_close , d: Image.new( 20 , 20 , [180,220,180] ) , }) ,
     max:  ({ x: x -40 + w , y: y , sym: :window_title_max , d: Image.new( 20 , 20 , [220,220,180] ) , }) ,
     }) ,
    }) ,
   }) ,
  }) ,
 }) ,
})
513デフォルトの名無しさん:2011/06/26(日) 04:28:44.50
あぁ、それは自慢だったのか。
514デフォルトの名無しさん:2011/06/26(日) 04:32:37.60
>>512
変数を減らすためにあらゆるものを再帰とサーチで済ましていて
そのせいで処理速度がちょっとRubyではきつくなってきてる
515デフォルトの名無しさん:2011/06/26(日) 04:34:50.47
安全って何?

メモリ安全?
型安全?
モジュラリティ?
仕様に準拠しているかどうか?
516デフォルトの名無しさん:2011/06/26(日) 04:35:50.29
object.search_upとobject.window_template2のobjectって同じものか?
517デフォルトの名無しさん:2011/06/26(日) 04:38:23.76
>>515
やっぱり動的言語では安全なソフトは作れない
http://hibari.2ch.net/test/read.cgi/tech/1306002146/1

1 名前:デフォルトの名無しさん[sage] 投稿日:2011/05/22(日) 03:22:26.61
型をしっかり明記してこそ
安全で堅牢、バグのないソフトは作れる
518デフォルトの名無しさん:2011/06/26(日) 04:42:16.75
俺はRubyの読み書きが出来るが>>512の例は正直単に読みにくいという
以上の感想が持てん。
集合操作のメソッドチェインとUIか何かの宣言的記述など珍しくもない。

誰か見所を教えてくれ。
519デフォルトの名無しさん:2011/06/26(日) 04:43:38.30
>>512
uyさんぱねぇっす
まじ読めねぇっす
たしかに異次元な感じっす
520uy ◆KOAgYBL/Xg :2011/06/26(日) 04:45:10.88
>>514
半分は、正解。

けど変数のサーチによって速度は遅くなるのは毎回サーチする意味ないから、やろうと思えば回避可能
ソースコードの見た目的な問題で、毎回サーチするようにかいてるけど、たかが知れてる誤差

つうか闇ブログ見つけたのか
もう放置してるけど
521デフォルトの名無しさん:2011/06/26(日) 04:47:14.94
>>520
お前が馬鹿だという証明になってしまったなw
522デフォルトの名無しさん:2011/06/26(日) 04:47:38.13
>>512
なんでシンボルにしてんの?
シンボルと同じ名前の変数に束縛しても同じじゃん。
しかも変数のほうが速いだろ。
削除したいからか?
523デフォルトの名無しさん:2011/06/26(日) 04:47:57.67
>>517
バグのなさが安全だっていうならCoqあたりで証明するしかないんじゃないか?
524デフォルトの名無しさん:2011/06/26(日) 05:10:50.72
>>521
Rubyを使わない俺にその点を分かりやすく解説してくれると嬉しい。
525デフォルトの名無しさん:2011/06/26(日) 05:25:23.52
>>524
あ、うん。俺もわからない。
526uy ◆KOAgYBL/Xg :2011/06/26(日) 05:29:07.11
>>516
同じ種類のクラスオブジェクトだけど、別変数、
↓ window_template2やったobject
object.task.each do | key , object |
 object ← search_upやってるobject
end

>>522
殆どのアルゴリズムは漏れは変数名を意識しなくてもかいていけるので、変数宣言をする意味がない



>>524
やめろ
527デフォルトの名無しさん:2011/06/26(日) 05:31:04.87
とりあえず、うゆはNGでおk
Rubyスレでもあんまり相手にされてないから放置しといて
528uy ◆KOAgYBL/Xg :2011/06/26(日) 05:31:27.26
たかがほんのわずかにソース晒した程度で
こんなに興味もたれるってなんなの?wwww
普段バカにしてるくせに
やっぱりuyの実力を心のどこかでは認めていましたtってこと????
529uy ◆KOAgYBL/Xg :2011/06/26(日) 05:42:06.13
>>527
ハァアA???
Rubyスレで誰よりも良質で速い回答しているのはどこのどなた様ですかァ????????
夢に飽きたらRubyスレにおいで^^^^^^^^^^^^^^^^^^^^^^^^^^^^
530デフォルトの名無しさん:2011/06/26(日) 05:53:00.75
> Rubyスレで誰よりも良質で速い回答しているのはどこのどなた様ですかァ????????

ん? 俺のことだが?
531デフォルトの名無しさん:2011/06/26(日) 05:58:37.58
>>526
>同じ種類のクラスオブジェクトだけど、別変数、
>↓ window_template2やったobject
>object.task.each do | key , object |
> object ← search_upやってるobject
>end

意味が解からん。インスタンス的に別だと言いたいのか?
それともインスタンスを束縛している変数だけ違うといいたいのか?
あと、今の情報だけじゃobject.search_upを実行してる時、objectのselfをyeildに引渡してるように
渡してるようにしか見えん。
532デフォルトの名無しさん:2011/06/26(日) 06:04:54.87
Ruby初心者スレの誰かさんは回答速いだけで質としては最悪の部類だからな…
533uy ◆KOAgYBL/Xg :2011/06/26(日) 06:39:29.29
>>531
そう、別インスタンス。hash値が別物。って意味
どうせ理解できんて

今説明してるとこって、漏れの設計の中ではまだ簡単な範囲だぞ
あと一般的じゃない概念を2つは説明しないと全体像すら伝えきれない

ひとつわかったことは
根幹が一般的じゃない作り方してると、その上に乗っかる概念も全然別物にしていかないと
効率が出ないって事、

まずevalも大量に使ってるし、根幹にあるそのobjectのクラスはOpenStructと同じようにハッシュからメンバ変数作る感じだし
そのオブジェクトに必要なメソッドは生成してからmoduleをextendしていく感じ、
なおかつ、そのmoduleは extendedとdefine_singleton_methodと各メソッドも内部でOpenStructとlambda使って
かなりえぐい事もやってるし説明しきれる気がしない
ようは、すべてのオブジェクトの為に、毎回、必要なメソッドを「生成」し、メソッド内部の状態変数にも外部からアクセス出来るように
させる為のdefine_singleton_method つまり特異メソッドなんだけど、
これはRubyだとクラスで多重継承できないって限界があるから、クラスのかわりにmodule、initializeの代わりにextended使ってるだけ
正直、最初は関数型プログラミングの派生だったはずなんだけどその面影もなく、

まずRubyとlambdaに熟知していないと全体像すら見えないのに、相手のレベルすらわからず説明とか、
どのレベルからやっていいか不明だし
無駄

ただひとつ、この事実を伝えるならば、俺がこの手法を開発したことでOOを完全にプギャー出来るようになったって事実

参考になりそうな資料
http://www.youtube.com/watch?v=tf1RxvHWH5c
http://blog-imgs-23.fc2.com/k/a/i/kai1993/20080727184304.jpg
534uy ◆KOAgYBL/Xg :2011/06/26(日) 06:42:29.18
はいはいすれちすれち



















 
535デフォルトの名無しさん:2011/06/26(日) 06:54:56.95
あー、あれだ。

初心者ってのは回りくどいことをして
ドヤ顔するよね。無駄なことやってるだけなのに。
536デフォルトの名無しさん:2011/06/26(日) 06:59:34.96
俺のやり方とか言い出したら
終わりだろうな。
537デフォルトの名無しさん:2011/06/26(日) 07:39:15.22
えぐいやり方ってのはそれに見合った結果が伴って初めて正当化される
のであって、成果物も示さずにえぐいだけではただのオナニー。

まぁ書かれている範囲では単に壮大な車輪の再発明をしているだけの
ようにしか思えんが。
538デフォルトの名無しさん:2011/06/26(日) 07:58:55.42
何を使っているのか道具立てばかり説明して何をやっているのかを説明しない
人間は大抵自分自身何をやっているのか理解出来ていないか、説明に値しない
事しか出来ていないというのが典型的なパターンだな。

プログラミングに限らないよ。写真とかスポーツとか、道具が必要な事柄では
大抵このパターンが観測される。
539デフォルトの名無しさん:2011/06/26(日) 08:31:52.54
俺の見る限りでは、そのように言うだけの奴がいちばんたくさん観測される
540uy ◆KOAgYBL/Xg :2011/06/26(日) 08:48:04.31
なんだかんだで公開する、自分のアホさに泣けてくる
http://www.geocities.jp/c_zelos/soto/mikomiu2011_06_26_00_07_32.zip

これはuy様だから、書けてるだけ 一般人にこれを書けとは言わない
質問は受け付けねーよ
今回のは、もう根幹部分は完璧になってるから、
もう書き換えることは、ない
ソースコードがすべて

真理について少しだけ語ると、このソースは完璧を目指したソースコードで
オブジェクト指向とかは、非完璧ながらも、それを制御することを目指したソースコードになるんだよ
俺は、非完璧でかいていくほうが最終的には良い、って所までわかった上でこれをやってる
別に誰かがこっち側に来るのも良いけど、多分俺の今かいてるこれが限界点だから、これ以上の進化は無いし
それと対照的に、非完璧 ながらもそれを制御することを目指していくと、限界点が無く、無限に進化し続ける事が可能なんよ
けどまだ見ぬ概念、 擬似完璧というものがあると思う。 その擬似完璧を発見する為には、
非完璧方面が成長するだけじゃ足りず、完璧側も成長させた上で、その集大成を組み合わせることで完成する
俺が死ぬ前に擬似完璧の概念が、自分で発見出来るかも怪しいし、間違っても世界にそれが広まる様子を見れる事はないな・・
完璧なソースコードが広まるのは20年後、 さらなる上、擬似完璧が出来上がるのは100年後といったところ


せっかくのソースもこんな場所に公開しちゃったし


もうゼロの使い魔4期に期待しつつ消えるとする・・・・・・・・


541デフォルトの名無しさん:2011/06/26(日) 09:09:39.94
evil-ruby用の新ネタ……?
542uy ◆KOAgYBL/Xg :2011/06/26(日) 09:23:25.25
擬似完璧の、開発入るから、もうそれ やるよ
543デフォルトの名無しさん:2011/06/26(日) 09:25:02.09
p "真理について少しだけ語ると、このソースは完璧を目指したソースコードで
オブジェクト指向とかは、非完璧ながらも、それを制御することを目指したソースコードになるんだよ
俺は、非完璧でかいていくほうが最終的には良い、って所までわかった上でこれをやってる
別に誰かがこっち側に来るのも良いけど、多分俺の今かいてるこれが限界点だから、これ以上の進化は無いし
それと対照的に、非完璧 ながらもそれを制御することを目指していくと、限界点が無く、無限に進化し続ける事が可能なんよ
けどまだ見ぬ概念、 擬似完璧というものがあると思う。 その擬似完璧を発見する為には、
非完璧方面が成長するだけじゃ足りず、完璧側も成長させた上で、その集大成を組み合わせることで完成する
俺が死ぬ前に擬似完璧の概念が、自分で発見出来るかも怪しいし、間違っても世界にそれが広まる様子を見れる事はないな・・
完璧なソースコードが広まるのは20年後、 さらなる上、擬似完璧が出来上がるのは100年後といったところ".scan(/完璧/).size
544デフォルトの名無しさん:2011/06/26(日) 09:54:57.24
>>538
手段があっても目的がないからね。
手段を目的化するか目的をでっち上げるしかない。
545デフォルトの名無しさん:2011/06/26(日) 10:48:29.00
一晩でスレすげー進んでて笑えるwww

結局、テストは静的/動的言語の両方でするってことでいいの?

個人的な経験としては、テスト書けば「わざわざ型検査に関するテストを書かなくても」
型エラーは見つかると思ってるんだが、静的言語派はそうは考えないってことだよね?
なんでそう思うんだろう?
546545:2011/06/26(日) 10:51:19.59
あ、>>482がすでに同じようなこと書いてた
547デフォルトの名無しさん:2011/06/26(日) 11:02:36.37
>>493
それだけで満足じゃないなら、コンパイルして通ればもう安全、
じゃないってことだよね?
安全なプログラム書くためにはテスト必要だよね?
テスト書くんだよね?書いてるんだよね?

で、型エラーはテスト実行時に見つかるよね?
何が問題なの?
548uy ◆KOAgYBL/Xg :2011/06/26(日) 11:03:54.73
>>1-10000
っっっっっはあwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww?
549デフォルトの名無しさん:2011/06/26(日) 11:14:20.56
>>547

>>482の流れだと

静的言語:型チェックのテストを書く。静的に型チェックされる。
動的言語:型チェックのテストを書かない。静的に型チェックされない。

ということになるかな?
動的言語は安全そうには見えないが……
550デフォルトの名無しさん:2011/06/26(日) 11:18:13.92
>>549
型付け自体が弱くなければ、テスト実行時に型チェックされる
551デフォルトの名無しさん:2011/06/26(日) 11:26:42.75
静的厨はテストやらないから、
「コンパイル時にチェックされないこと = 本番までチェックされないこと」
になるんだよね?そうだよね?
552デフォルトの名無しさん:2011/06/26(日) 11:33:34.13
そうだよ。

動的厨はテスト完全にやれば大丈夫と言うんだろうけど、
でかいシステムでは、至難の業。

そう言う現実を見てない/知らないから、動的厨でいられ
るんだろうけど。
553デフォルトの名無しさん:2011/06/26(日) 11:35:01.73
現実って言葉を多用する奴ほど、そいつの脳内設定のことである確率が高い
554デフォルトの名無しさん:2011/06/26(日) 11:37:51.52
型付けの強い/弱いと、静的/動的は直交する概念
強い動的型付け言語の場合、実行時に自動的に型の整合性はチェックされる

だからテストを書いてれば、わざわざ型チェック用コードを入れなくても
型エラーは調べられる

ま、それもこれもカバレッジが十分高い場合だけなのは事実だが、
静的言語であっても十分にテストされてないコードは
安全とは言いかねる
555デフォルトの名無しさん:2011/06/26(日) 11:39:49.72
>>552
あなたの現実 = 土方ですよねーwww
556デフォルトの名無しさん:2011/06/26(日) 11:47:49.46
>>553
> 現実って言葉を多用する奴ほど、そいつの脳内設定のことである確率が高い

それこそでかいシステムに携わったことないやつの脳内イメージだと思うが。

>>554
> 静的言語であっても十分にテストされてないコードは安全とは言いかねる

それは事実だが、静的言語であればコンパイル時に型の不整合はチェック
されてるから、少なくともそこに起因するバグだけは少なくなる。

>>555
土方かどうかかかわらず、現実だからな。
脳内で作った気になるならいいんだろうけど。(w
557デフォルトの名無しさん:2011/06/26(日) 11:50:20.88
プログラマの仕事を刺身パックを作る作業工程で例えると

・C/C++ PG    : 魚を捕ってくる人
・動的言語 PG : 魚を捌いて刺身にする人
・Java 土方   : 刺身にタンポポ乗せる人 

仕事が違えば必要とされる道具(言語)も違う
558デフォルトの名無しさん:2011/06/26(日) 11:54:00.52
>>557
あれはタンポポじゃなくて、食用菊だぞ。
559デフォルトの名無しさん:2011/06/26(日) 11:59:45.83
>>556
つまり動的言語でもテスト書けば安全ってことと、
静的言語でもテスト書かないと安全じゃないってことは認めるのか?
560デフォルトの名無しさん:2011/06/26(日) 12:00:57.88
>>557
>・動的言語 PG : 魚を捌いて刺身にする人

なんか適当に切り刻んだ刺身が出てくる店の話?
561デフォルトの名無しさん:2011/06/26(日) 12:03:07.57
脳味噌の知識が適当に切り刻まれてる人の反応
562デフォルトの名無しさん:2011/06/26(日) 12:03:40.93
>>556
>それは事実だが、静的言語であればコンパイル時に型の不整合はチェック
>されてるから、少なくともそこに起因するバグだけは少なくなる。

逆に言えば動的言語はコードの汎用性を高めるために
静的言語では機械がチェックしていることをわざわざ人間にやらせているということになるのかな。
プログラマの負担が増えるのでは本末転倒のような気もする。
563デフォルトの名無しさん:2011/06/26(日) 12:05:29.69
>>562
お前は型付けの強い弱いと静的動的を混同してる
564デフォルトの名無しさん:2011/06/26(日) 12:08:31.66
>>562
テストが実行されれば型は実行時に機械的にチェックされる
どうせテストは書くんだから、プログラマの負担は増えてないよ?
565デフォルトの名無しさん:2011/06/26(日) 12:08:33.70
閃いた!まず「安全なソフト」とは何かを定義しようぜ。そうすれば、このスレから
無駄な煽りが消えるんじゃね?
566デフォルトの名無しさん:2011/06/26(日) 12:10:20.00
安全なソフト = 型エラーが無い

        静的言語最強
567デフォルトの名無しさん:2011/06/26(日) 12:13:21.51
でも実行時エラーは当然ながらコンパイル時には拾ってくれないんでしょ?がっかりです(棒
568デフォルトの名無しさん:2011/06/26(日) 12:14:46.46
>>559
> つまり動的言語でもテスト書けば安全ってことと、
> 静的言語でもテスト書かないと安全じゃないってことは認めるのか?

そりゃそうだろ。

ただ、問題は完全なテストを書けるかだ。

>>562
> 静的言語では機械がチェックしていることをわざわざ人間にやらせて
> いるということになるのかな。

単に静的はコンパイル時に、動的は実行時にチェックしてるだけのこと。
ただ、コンパイル時にチェックするためにそれ相応の情報が必要なので、
ちょっとコードを書くのが面倒だったする。
569デフォルトの名無しさん:2011/06/26(日) 12:17:10.35
>>561
脳味噌の知識がないやつは気楽でいいねぇ (w
570デフォルトの名無しさん:2011/06/26(日) 12:18:26.28
例えば、不等式を満たせば実数型であることも自動的に確定するみたいに
値のテストは型のテストを兼ねる

型のテストが必要になるのは、型さえ合えばどんな値でも構わない場合に限られる
571デフォルトの名無しさん:2011/06/26(日) 12:21:22.54
もちろん、値なんてどんな値でも構いませんよ
コンパイル時にチェック出来ないものは全部仕様ですwww
572デフォルトの名無しさん:2011/06/26(日) 12:34:37.94
>>563
そう言われてみればそのとおり。
573デフォルトの名無しさん:2011/06/26(日) 14:07:46.53
全てのバグをコンパイラが見つけてくれるわけじゃないんだから
動的でいいじゃん。俺があらゆるテスト書くから。

こんな奴信用するか。
574デフォルトの名無しさん:2011/06/26(日) 14:09:17.86
動でも静でもない言語ってないの?
575デフォルトの名無しさん:2011/06/26(日) 14:11:39.23
アセンブリ
576デフォルトの名無しさん:2011/06/26(日) 14:28:37.92
そりゃ鬱的言語だろ
577デフォルトの名無しさん:2011/06/26(日) 15:08:54.77
>>573
俺はテスト書かないから、テスト書くって言ってる奴は信じられん
そういうことですね?
578デフォルトの名無しさん:2011/06/26(日) 15:25:46.06
静的言語はコンパイラが型検査してくれるから
テストしなくても安全なんですよ。

こんな奴信用するか。
579デフォルトの名無しさん:2011/06/26(日) 15:28:24.17
>>578
>静的言語はコンパイラが型検査してくれるから
>テストしなくても安全なんですよ。
>こんな奴信用するか。

誰も言ってもいないような話を持ち出す奴も信用ならんだろう。
580デフォルトの名無しさん:2011/06/26(日) 15:30:17.98
ま、言ってるも同然なんだけどね。
581デフォルトの名無しさん:2011/06/26(日) 15:34:27.01
>>573
まさにこんな奴らが釣れててワロタ
582デフォルトの名無しさん:2011/06/26(日) 15:36:38.52
テスト書かない土方仕事してるのは俺だけであってくれ!って
心の叫びが聞こえるスレ
583デフォルトの名無しさん:2011/06/26(日) 15:38:33.74
テスト書くってことにしたら
動的言語でも安全なソフトが組めるってことで
話が終わっちゃうじゃん
584デフォルトの名無しさん:2011/06/26(日) 15:38:43.04
なんで静的に型チェックするといったら
テストはしないってことなんだって
勘違いするのか理解できん。

どうしてそう思ったのか、
そこを説明してくれないか?
585デフォルトの名無しさん:2011/06/26(日) 15:39:56.38
586デフォルトの名無しさん:2011/06/26(日) 15:41:04.41
>583
今言ってるのは、型チェックのテストのことだよ。

静的言語では、コード書いているうちに自動的に行える型チェックのテストを
動的言語では手動で書くということでいいのか?
上の方で、型チェックのテストは書かないと
言っていたはずだが。

動的言語は、テストを書かないってことでいいね?
587デフォルトの名無しさん:2011/06/26(日) 15:42:10.09
588デフォルトの名無しさん:2011/06/26(日) 15:43:49.15
>>583
> テスト書くってことにしたら

> 動的型言語では型チェックを一々テストでも書かないよ。
> 動的型言語では型チェックを一々テストでも書かないよ。
> 動的型言語では型チェックを一々テストでも書かないよ。

読みましたか?

テストは書かないのです。
589デフォルトの名無しさん:2011/06/26(日) 15:44:34.56
なにが「動的言語は、テストを書かないってことでいいね?」だよ
頭おかしいんじゃないの?www
>>554でも読んどけ
590デフォルトの名無しさん:2011/06/26(日) 15:48:46.04
屁理屈の応酬。もっと有意義に時間使えばいいのに。
591デフォルトの名無しさん:2011/06/26(日) 15:50:13.40
最初からそれができないバカの隔離スレとして立ったスレで何をいまさらw
592デフォルトの名無しさん:2011/06/26(日) 15:51:05.66
593デフォルトの名無しさん:2011/06/26(日) 15:56:46.68
つーかさ、静的言語にとって、型が違うとか
引数の順番や数が違うとかそういうのは

ケアレスミス なんだよ?

コンパイラが教えてくれるもの。

それを、自分でテストかコード書いて
自分で調べるって、無駄だろ。
ケアレスのためにどれだけ苦労してるんだよ。
594デフォルトの名無しさん:2011/06/26(日) 15:57:26.52
>>589
動的型言語では型チェックを一々テストでも書かないよ。
595デフォルトの名無しさん:2011/06/26(日) 16:02:01.65
>>592
>>437
> プログラムの性質を確認するために普通なら必要だった単体テストの数を減らしてくれる

ってのは嘘だと思う

だって実行したら機械的に型チェックも行われるんだよ?
>>570のいうように値をテストしたら型チェックも兼ねるんだよ?
また関数の引数の数も機械的にチェックされるよ?
つまり、最低限のまともなテストを実行したら型チェックは行われるんだよ

まあ、最低限のテストさえしないなら型チェックは行われないが、
そんなプログラムは安全ではない
596デフォルトの名無しさん:2011/06/26(日) 16:03:27.23
> だって実行したら機械的に型チェックも行われるんだよ?

実行しなかったら?
たとえ実行したとしても
エラーになるデータを使わなかったら?
597デフォルトの名無しさん:2011/06/26(日) 16:04:20.06
しかしレスだけ見ても信用なさそうな奴らばっかだな
598デフォルトの名無しさん:2011/06/26(日) 16:06:44.24
>>596
そんなもんアウトに決まってる
でも、その場合は静的言語でも型検査通ってるだけで
値のチェックも何も通ってないんだから
安全とはいいかねる
599デフォルトの名無しさん:2011/06/26(日) 16:10:53.35
結局こんなとこでグダグダ言っててもなぁ

日本の土方が書くJavaプログラムよりは
Amazonのプログラマが書くPerlの方が安全だろうし、
結局は書き手の能力に依存しすぎる

俺は日本の土方に書かせるなら絶対に静的言語一択だけど
600デフォルトの名無しさん:2011/06/26(日) 16:11:41.54
安全か、安全でないか、0と1で考えるからダメなんだよね。

安全ってのは0から100%まである。
で、漏れや時間がなくて手抜きしたとき、そのパーセンテージは下がる。

テストを完璧にやれば100%だが、
テストの組み合わせの数を考えると、IFが10個あるだけで
テストパターンは1024個にもなる。

そこから考えると、実行時に手動でテストコードを書くよりも
実行前にコンパイラを使うことで自動的にテストするほうが良い。
自動テストなら組み合わせがいくつあっても、テストは1つですむ。

そうやって節約できた時間で、テストコードを書く。
そうして安全度を高めるのだ。
601デフォルトの名無しさん:2011/06/26(日) 16:16:42.33
まあ動的言語のほうがテストも書き易いんだけどね

安全かどうかが程度問題というなら、
動的言語で十分にテスト書かれてるなら型検査も十分にテストされてる
静的言語はテスト書かなくても100%型検査はテストされてるが
十分にテスト書かないと結局は安全とは言い難い
602デフォルトの名無しさん:2011/06/26(日) 16:17:19.86
動的言語厨は基本的に
「理論的には」で語ってるよね。

現実を知らないのでは?
603デフォルトの名無しさん:2011/06/26(日) 16:17:33.57
> まあ動的言語のほうがテストも書き易いんだけどね

それはない。
604デフォルトの名無しさん:2011/06/26(日) 16:19:27.89
>>602
現実の話をしたら、テスト後に型エラーなんて見ないからさ
なに型検査にばかり拘ってるのか不思議
605デフォルトの名無しさん:2011/06/26(日) 16:19:33.80
動的言語はテストの必要がないほど
小規模のプロジェクトでしか使われないんだろ
606デフォルトの名無しさん:2011/06/26(日) 16:19:45.39
>>603
じゃあテスト書いてみてよ
607デフォルトの名無しさん:2011/06/26(日) 16:21:26.44
> テスト後に型エラーなんて見ないからさ

それはテストが完璧な場合の話。

世の中に完璧なテストが行われている
プロジェクトがあるのか?
テストが完璧ならバグもないはずだが。


結局、人間ががんばらないといけないものは完璧にはならない。
だから機械(コンパイラ)にさせるんじゃないか。
608デフォルトの名無しさん:2011/06/26(日) 16:22:02.05
理論的にはテスト後に型エラーなんて見ないからさ
609デフォルトの名無しさん:2011/06/26(日) 16:22:34.50
>>599
同意
610デフォルトの名無しさん:2011/06/26(日) 16:23:23.50
>>606
assertEquals(1, 2);

611デフォルトの名無しさん:2011/06/26(日) 16:36:12.77
>>607
完璧じゃないなら安全じゃないなら
この世に安全なプログラムは存在しないな
テスト項目は型検査だけじゃないからな
612デフォルトの名無しさん:2011/06/26(日) 16:38:33.90
プログラムの安全さ

静的言語withテスト >= 動的言語withテスト >>>>>>>> 静的言語 >>>> 動的言語 >> ∞ >> Java土方のプログラム

理論的には静的言語の方が安全
613デフォルトの名無しさん:2011/06/26(日) 16:40:48.23
どっちも安全じゃ無いなら、動くプログラムが速い方が良い
614デフォルトの名無しさん:2011/06/26(日) 16:44:20.99
>>611 >>613
ほらねw やっぱり動的厨は
安全を0か1で語ってる。
さっき書いたとおりでしょ?
615デフォルトの名無しさん:2011/06/26(日) 16:46:45.46
>>614
型検査を0か1かで語ってるのはお前
616デフォルトの名無しさん:2011/06/26(日) 16:50:50.92
結局>>599でFAだろ
617デフォルトの名無しさん:2011/06/26(日) 17:12:17.27
>>614
>>613はどう見ても静的言語の事だろ
618デフォルトの名無しさん:2011/06/26(日) 17:26:03.29
>>610
>assertEquals(1, 2);

それのどこが、

 >>601
 > まあ動的言語のほうがテストも書き易いんだけどね

を示すことになるんだ?
619デフォルトの名無しさん:2011/06/26(日) 17:34:14.73
>>618
何言ってんだ?それは

動的言語の方がテスト書き易い(>>601
=> それはない(>>603)
=> じゃあ書いてみろ(>>606)

って言われて、静的厨が頑張って書いたテストコード(笑)じゃん
620デフォルトの名無しさん:2011/06/26(日) 17:38:01.02
>>619
おお、そうか、素で間違ってたよ。

なら、動的ならこれより書き易いんだな。
動的のテストコードフリーズ。
621デフォルトの名無しさん:2011/06/26(日) 17:39:12.41
つーか、そこはまともなテストコードを提供できない
静的厨を笑うところ
普段からテスト書いてねーのかよ
622デフォルトの名無しさん:2011/06/26(日) 17:43:16.03
まあ、いまごろ頑張ってJUnitぐぐってんだろーな
頑張れよwww
623デフォルトの名無しさん:2011/06/26(日) 17:43:50.79
言い訳がましいな。

なんでテストコード書いてみろと言われて
書かずにそんなレスをするのか?
624デフォルトの名無しさん:2011/06/26(日) 17:43:59.56
またお題でも出して書き比べれば?
625デフォルトの名無しさん:2011/06/26(日) 17:45:48.49
>>623
だってもう動的言語のテストの例は出てるじゃん
626デフォルトの名無しさん:2011/06/26(日) 17:47:59.46
それは>>610のことか?
627デフォルトの名無しさん:2011/06/26(日) 17:49:49.41
610はJavaでしょ?

それを動的言語で書いたら
どうなるかなーってのが今の話の流れ
628デフォルトの名無しさん:2011/06/26(日) 17:50:13.96
>>626
unittestで検索したら>>132があったよ
629デフォルトの名無しさん:2011/06/26(日) 17:52:38.70
ずばり、この部分がユニットテスト。
これをJavaでかいたらどうなるのか?

import unittest
class TestFoo(unittest.TestCase):
def test(self):
foo('a', 'b', '111')
self.assertRaises(ValidationError, foo, 'a', 'b', 111)
self.assertRaises(ValidationError, foo, 0, 'b', '111')
self.assertRaises(ValidationError, foo, 'a', 0, '111')
630デフォルトの名無しさん:2011/06/26(日) 18:00:32.73
Javaしらないけど、こんな感じじゃねーの?
セミコロンとかダブルクォーテーションとか
どうでもいいところは手抜きして書いた。

@Test(expected=ValidationError.class)
public void footest(a,b,c) {
  foo(a, b, c);
}
public void test() {
  foo('a', 'b', '111')
  foo(0, 'b', '111')
  foo('a', 0, '111')
}
631デフォルトの名無しさん:2011/06/26(日) 18:01:08.27
よくわからんがそれって型チェックが機能してるかのテストじゃないの?
静的言語では書かなくて良いたぐいのテストコードになるんじゃない?

foo関数でちゃんと値が追加されてるかテストしろとかならわかるけど…
632デフォルトの名無しさん:2011/06/26(日) 18:12:33.42
>>631
つまりfoo()がhashを返すような関数の場合に変更して、

self.assertEqual(foo('a', 'b', '111')[0], '111')

的なコードを書けってことかい?
なんか本質的なつっこみじゃないなぁ
633デフォルトの名無しさん:2011/06/26(日) 18:25:21.80
>>621
>つーか、そこはまともなテストコードを提供できない
>静的厨を笑うところ
>普段からテスト書いてねーのかよ

いや、どう考えても

> まあ動的言語のほうがテストも書き易いんだけどね

なんてこと言ってる奴のターンだろ。
634デフォルトの名無しさん:2011/06/26(日) 18:31:03.17
動的言語はテストのときにMockが作りやすいかもしれないね

from minimock import mock, restore
mock(module.bar)
...
restore()

しとけば、...では内部でbar()を呼んでるコードはモックに置き換えられるとか
635634:2011/06/26(日) 18:34:52.19
mock('module.bar')の間違いだった

あと静的言語でも同じことできるのかも
636デフォルトの名無しさん:2011/06/26(日) 18:42:47.95
ScalaTestのFunSuiteを使った場合のイメージ

class FooTest extends FunSuite {
 test("foo関数の型チェックテスト") {
  foo("a","b","111")
  intercept[ValidationError]{ foo("a","b",111) }
  intercept[ValidationError]{ foo(0,"b","111") }
  intercept[ValidationError]{ foo("a",0,"111") }
 }
}
637デフォルトの名無しさん:2011/06/26(日) 18:50:28.27
なんかすっっげー。ずっと同じ話で600まで来てんのか。
平行線にしても凄すぎるわ。
もうちょい濃い議論してんのかと思ったのに。
スレ開いて損した。
638デフォルトの名無しさん:2011/06/26(日) 19:54:32.43
>>601
静的言語だからってなんでテストコードを静的言語で書かないといけないの?
639デフォルトの名無しさん:2011/06/26(日) 20:18:29.94
>>637
そもそもスレタイからどんどん脱線するからなこのスレ
その上コテが住み着いてちゃ纏まるはずがない
640デフォルトの名無しさん:2011/06/26(日) 20:53:26.09
て言うか、宗教戦争ってこんなもんだろ。
641デフォルトの名無しさん:2011/06/26(日) 23:50:15.49
ユニットテストが正常に動作するなら
プログラムが正常に動作するなんて保障どこにもないし

別モジュールが未完成のハードウェアだったり
要求仕様自体が間違ってたりしたらどーするんだよ?
ユニットテストの目的は別な所にある
642デフォルトの名無しさん:2011/06/26(日) 23:57:38.15
>>641
それをいうとプログラム停止問題と同じで100%保証は無理。

>別モジュールが未完成のハードウェアだったり
仕様が決まってるならスタブ使えばいいかと。
643デフォルトの名無しさん:2011/06/27(月) 00:36:02.71
既に静的も動的も無い話になっとる。
644デフォルトの名無しさん:2011/06/27(月) 00:47:27.52
>>641
テストで安全は担保出来ないという話なら、同意。
あくまで誤りを検出して、修正するのが目的だから。
645デフォルトの名無しさん:2011/06/27(月) 00:59:32.15
型による検証は網羅的で強力だが、
型の制約は実質的に必要な制約より強すぎるんだよな
そこで一種のトレードオフになってしまう
646デフォルトの名無しさん:2011/06/27(月) 01:04:10.84
> 型の制約は実質的に必要な制約より強すぎるんだよな

どんな時に、その制約以上のことをしたくなるんだ?
647デフォルトの名無しさん:2011/06/27(月) 02:04:16.19
型は制約というより宣言だろう。

今から○○の型を使います。
この引数は○○の型です。

宣言した後、○○の型といいましたけど、
違う型として使います。なんていうのは
そもそも設計が間違ってる証拠なんだよ。
648デフォルトの名無しさん:2011/06/27(月) 02:40:31.65
645じゃないけど。
例えばJavaで既存のライブラリ使っててイライラするのはこういう辺り。
Javaでプログラム組む時の設計思想としてクラスの責務をなるべく狭くするよね。
結果として細かいクラスが沢山できる。特にバリュークラスなんかが。
Stringそのままを使うのではなく、Stringをフィールドに持つnichan.res.Nameクラスが作られたりする。
で、Stringのサブクラスではないので、Stringのメソッドは使えないし、Stringを仮引数に持つメソッドにも渡せない、getName()で参照する事しかできない。
クラス設計者が想定した範囲外のことをやろうとすると、とても面倒になる。
649デフォルトの名無しさん:2011/06/27(月) 03:02:16.65
>>648
> getName()で参照する事しかできない

参照する以外に何をやりたいの?
getNameしか用意されていないのであればクラスの設計者が参照以外の
操作は安全ではないと言っているのだろう。

>Stringのメソッドは使えないし

getNameで取ってきた値には使えるだろう。

>Stringを仮引数に持つメソッドにも渡せない

getNameで取ってきた値は渡せるだろう。

何が困るの?
650デフォルトの名無しさん:2011/06/27(月) 03:28:27.96
>>645
静的型の制約は弱すぎるからランタイムエラーがなくならない

あれだけ無駄に長々と書いてもまだ弱いから、
静的型に使う労力をテストに使った方がいいんじゃないかという話が出てくる
651デフォルトの名無しさん:2011/06/27(月) 03:32:37.20
出てくる!
言ったもん勝ちだなw
652デフォルトの名無しさん:2011/06/27(月) 03:46:13.95
> 静的型の制約は弱すぎるからランタイムエラーがなくならない
なくすのが目的じゃなくて、減らすのが目的なんだよ。

ランタイムエラーは静的エラーと違って見つけるのが難しい。
だからなるべく減らすべきものなんだ。

静的エラーで分かるようなことを
ランタイムエラーにするのは
余計に労力がかかることになる。
653デフォルトの名無しさん:2011/06/27(月) 04:18:30.28
Types Considered Harmful
http://www.cis.upenn.edu/~bcpierce/papers/harmful-mfps.pdf

既存の型システムの問題点について端的に
Benjamin C. Pierceつったら型の専門家のはずなので
まあ名無しよりは信用できるだろう

近い将来にはもっとまともな型システムが設計されて
動的の柔軟性と静的の検証・コード生成の効率化を
バランスさせることができるようになる……といいね
654デフォルトの名無しさん:2011/06/27(月) 04:20:22.32
動的が柔軟というけれど
別に対して柔軟じゃないな。
655デフォルトの名無しさん:2011/06/27(月) 07:46:37.65
Java土方「動的が柔軟というけれど別に対して柔軟じゃないな。(キリ」
656デフォルトの名無しさん:2011/06/27(月) 07:59:23.44
おや、言い返せなかった?
657デフォルトの名無しさん:2011/06/27(月) 08:31:26.86
静的型付け信者ってクラスの設計者の思想を優先しすぎだろ
拡張メソッドとかバカ仕様すぎる
658デフォルトの名無しさん:2011/06/27(月) 09:11:14.78
動的言語は柔軟すぎて大規模開発で使い難い。これは分かる
柔軟さに大差ないってのは、そいつが碌に動的言語を
知らないってことだからアホすぎる

「動的言語?型を省略出来るんでしょ?」程度の理解のJava土方らしいね
659デフォルトの名無しさん:2011/06/27(月) 10:05:33.07
なにここ
具体的なレスしたら負けなの?
660デフォルトの名無しさん:2011/06/27(月) 15:46:51.20
>>659
具体的なレスをどうぞどうぞ
661デフォルトの名無しさん:2011/06/27(月) 16:31:43.94
レスしたら負け
662デフォルトの名無しさん:2011/06/27(月) 20:57:04.10
Java土方にばーかばーかと
叫ぶスレだよ。

はいみんないっせいに
ばーかばーか、俺天才
663デフォルトの名無しさん:2011/06/28(火) 01:27:49.90
動的言語使ってるほうが土方だもん
664uy:2011/06/28(火) 05:41:16.34
結局、動的言語の速度でもアプリケーション開発いけるようになったのが
本当につい最近だから
静的言語側よりも、プログラマーの総数も、ソースコードの総量も
全然まだ無いんだよ 実績も、ライブラリもな
時代遅れの静的厨なんてほうっておいて、つくっていけば良い

実際、型エラー(笑) 程度、
思ったんだけど実際に作っていく段階で殆ど取れてるわ
無駄に、型としてクラス作りまくらなければなwwwwwwwwwwwwwwwwww

このスレにいる静的厨の中に
「静的言語も動的言語も開発効率はかわらない(キリッ」
ってのを、マジで言ってそうやつもいるし、マジでレベルが低いんだと思う
665デフォルトの名無しさん:2011/06/28(火) 06:14:13.89
>>664
ここはトイプログラムスレじゃないから
666デフォルトの名無しさん:2011/06/28(火) 06:33:43.58
>>665
それに触っちゃ、めーっよ
667デフォルトの名無しさん:2011/06/28(火) 06:35:13.01
実績ないやつがいくら叫んでも認められないってことにいいかげん気づけよ
668デフォルトの名無しさん:2011/06/28(火) 06:40:41.59
>>667
それはあれか?このスレ全体を皮肉ってるのか?w
669uy:2011/06/28(火) 15:26:50.64


667 :デフォルトの名無しさん:2011/06/28(火) 06:35:13.01
実績ないやつがいくら叫んでも認められないってことにいいかげん気づけよ




だから実績を作れよって言ってんだろ おれは。w
670uy:2011/06/28(火) 15:28:00.11
>>665
はぁ

そりゃ、君は動的言語が扱えないから?
トイプログラムしかつくれませーんって? いっちゃってるわけ?

自分からバカです  って自己申告してくる奴って多いよな・・・・・・・・・・・・・・・・・・・・・・・・・・
671デフォルトの名無しさん:2011/06/28(火) 15:48:41.74
自覚症状なしw
672デフォルトの名無しさん:2011/06/28(火) 15:56:03.47
土方仕事のwww実績はww無いわwwwww
673デフォルトの名無しさん:2011/06/28(火) 15:57:49.37
自覚症状なし
674デフォルトの名無しさん:2011/06/28(火) 21:28:52.33
とりあえず、土方と叩くことで
実績がないやつが満足するスレ。
675デフォルトの名無しさん:2011/06/28(火) 21:39:29.11
ひ、土方……
676デフォルトの名無しさん:2011/06/28(火) 21:50:23.50
馬鹿っていうやつが馬鹿なんだっていうのは
うまい言葉だよね。

結局自分が、○○と言われたら図星で嫌だと
思うから、そのことを他人に言うわけだよ。

本当は自分が○○なんだって自覚してるんだろうね。

あ、うん。土方の話ね。
677デフォルトの名無しさん:2011/06/28(火) 22:26:53.85
世の中の評価基準は
学歴や資格よりも実務経験優先だからな

屁理屈野郎がドカタ以下のゴミって事はよくある
678デフォルトの名無しさん:2011/06/28(火) 23:32:59.27
特にプログラミング業界はその気が強いね
基本的にどこも経験者募集だ
679デフォルトの名無しさん:2011/06/28(火) 23:38:38.39
Java土方って俺には結構Java界を褒めてるように聞こえる
だって、フレームワークやらライブラリやらがすごく成熟してるから
土方作業のように何も考えずに作れちゃうんでしょ?
動的言語でもRoRとかはいい感じに土方させてくれるのかな?
680デフォルトの名無しさん:2011/06/28(火) 23:57:58.89
Java土方ってなぜか使用しているプログラマーに言及してるだけだからね。
言語の話してるのに。
681デフォルトの名無しさん:2011/06/29(水) 00:00:23.00
じゃあ今度からおまえらのことJava土方って呼ぶわ
リアルで
682デフォルトの名無しさん:2011/06/29(水) 00:26:36.81
リアルでJava土方!って会社で叫んでるのを
想像してワロタw
683デフォルトの名無しさん:2011/06/29(水) 00:30:58.26
>>677
あるある
684デフォルトの名無しさん:2011/06/29(水) 01:10:35.95
大規模開発ってのが一山いくらの土方を集めて
開発するってことならJava一択だと一貫して主張してるが、
これはJavaを褒めてるんだよ
素直に喜べば良いのに
685デフォルトの名無しさん:2011/06/29(水) 01:15:21.67
他人を卑下しないと世界を受け入れられないのか
686デフォルトの名無しさん:2011/06/29(水) 01:21:57.15
職業に貴賤なしですぞ
687デフォルトの名無しさん:2011/06/29(水) 01:33:11.91
ひじかた
688デフォルトの名無しさん:2011/06/29(水) 02:01:35.60
ひじかたさんはJavaの使い手
689デフォルトの名無しさん:2011/06/29(水) 02:26:32.18
俺は世界一の動的言語使い。

土方とは格が違うのだよ。
690デフォルトの名無しさん:2011/06/29(水) 02:32:12.42
一山いくらのひじかた
691デフォルトの名無しさん:2011/06/29(水) 02:41:18.36
土方言語は仕事では使いたくないな。
そもそもドカが職になんかならないしw
692uy ◆hi.ht/Isu2 :2011/06/29(水) 03:38:22.03
JAVAって何
693デフォルトの名無しさん:2011/06/29(水) 03:43:07.71
刑務所 <-> JAVA
694uy ◆hi.ht/Isu2 :2011/06/29(水) 06:13:33.46
同感
695デフォルトの名無しさん:2011/06/29(水) 10:24:35.81
どうもこのスレを見ていると大規模だから凄い、エライって風潮が見え隠れするような。
大規模大規模って、世の中フルスクラッチな大規模開発ばかりじゃないってのよ。
696デフォルトの名無しさん:2011/06/29(水) 11:05:36.39
刑務所はRubyのイメージ。囚人が習うらしいし。
697uy ◆qq69ldDh7A :2011/06/29(水) 11:09:01.15
小物を沢山作って、集合させた大規模がこれからのプログラミングなんだよ ボケが
698デフォルトの名無しさん:2011/06/29(水) 11:18:47.23
それは昔のUnixとかからそうだったんだけど、
C++やJavaあがりのプログラマには難しいみたいだ
699デフォルトの名無しさん:2011/06/29(水) 11:25:34.27
C++やJavaだって本来そういう風に作るべきだし
700デフォルトの名無しさん:2011/06/29(水) 12:52:21.61
と論点をずらします
701デフォルトの名無しさん:2011/06/29(水) 21:23:12.66
Java自体は別に悪い言語ではないよ、使い手だって上から下まで居るだろう
ただ、このスレに来るJava使いにロクなのが…
702デフォルトの名無しさん:2011/06/29(水) 21:25:50.90
むしろこのスレをスルーするJava使いが賢明ということでは…
703デフォルトの名無しさん:2011/06/29(水) 23:12:57.30
Java土方ばーかばーか
704デフォルトの名無しさん:2011/06/29(水) 23:17:14.52
>>701
挫折しては再挑戦を繰り返してる趣味グラマーな自分でも答えられる質問がjavaスレだけ多いのが色々物語ってる気がする。。。
705デフォルトの名無しさん:2011/06/29(水) 23:22:46.75
動的言語は流行ってないということだ。
706デフォルトの名無しさん:2011/06/29(水) 23:24:24.16
というかまったく使わない奴いるのか?
707デフォルトの名無しさん:2011/07/01(金) 01:28:49.69
>>706
んなやついるわけねーよ
ここにいる奴らはみんな適材適所で動的静的を使い分けられる
みんなネタで煽りあってるのが分からないのか?
708デフォルトの名無しさん:2011/07/01(金) 03:37:03.10
Java土方だけは本気だけどな!
俺は動的言語のプロ
709デフォルトの名無しさん:2011/07/01(金) 04:05:47.69
>>707
買いかぶりすぎだろうw
動的言語のメリットである柔軟性に話が及ぶと
そこから先へは話が進んでいってないからね
710デフォルトの名無しさん:2011/07/01(金) 06:50:43.16
Windows + Eclipse + Java オンリーのやつとか普通に居そうだ
711デフォルトの名無しさん:2011/07/01(金) 21:47:18.91
そんな昔のコボラなおっさんじゃないんだから。
今の若い子はもっと色々できるだろう。
712デフォルトの名無しさん:2011/07/01(金) 22:23:42.01
今日もJava土方必死でカキコしてんのかよwww
713デフォルトの名無しさん:2011/07/02(土) 08:55:49.74
>>711
いや、若いヤツの方がそういうのが多いな

自宅ではMac使ってて、unixバリバリ使えて、LLもそれなりにいける
なんて感じのJavaの技術者なんて30以上のおっさんが多い
714デフォルトの名無しさん:2011/07/02(土) 10:38:53.99
>>713
つまり土方は30以上ってことか
715デフォルトの名無しさん:2011/07/02(土) 14:42:24.91
Mac使いに安全なソフトは作れない
716デフォルトの名無しさん:2011/07/02(土) 15:11:59.57
つまりiPhoneアプリは全部危険ってことか
717デフォルトの名無しさん:2011/07/02(土) 15:23:36.12
>>714-715
まあ、なんだ、ガンバレ。
718大天使 ◆uL5esZLBSE :2011/07/02(土) 17:35:58.03
はいはい天使天使
719デフォルトの名無しさん:2011/07/02(土) 22:45:27.98
大天使 == uy ?
720デフォルトの名無しさん:2011/07/02(土) 23:15:33.32
yes
721デフォルトの名無しさん:2011/07/02(土) 23:50:54.89
そのうち、智天使とか力天使に進化するんだろうか。
722天使 ◆uL5esZLBSE :2011/07/03(日) 14:11:36.42
死ねゴミ
723デフォルトの名無しさん:2011/07/04(月) 02:09:17.38
松本龍復興担当相、やや遅れて入室したことにへそを曲げ
知事との握手を拒否

http://www.youtube.com/watch?v=VtUqWdbjnTk

「客を出迎えるときはおまえが先に部屋に入ってから俺を呼べ」
「今のはオフレコで」
「書いたらその社は終わりだからな!」
724デフォルトの名無しさん:2011/07/05(火) 21:55:28.75
このスレ向けの話題があった

http://www.infoq.com/articles/twitter-java-use

英語だけど、読めるよな?
725デフォルトの名無しさん:2011/07/05(火) 22:42:15.33
ざっと読んだ限りだと
そこで書かれてるのって主にパフォーマンス面じゃね?
安全性の話はあまり書かれてないように見えるが
726724:2011/07/05(火) 22:47:11.34
>>725
そうか
いや、俺は読めなかったのでな
727デフォルトの名無しさん:2011/07/05(火) 22:50:00.84
(;^ω^)・・・
728デフォルトの名無しさん:2011/07/05(火) 23:04:34.43
>>726
ちょwww
729デフォルトの名無しさん:2011/07/05(火) 23:14:25.87
>>725
ああ、確かに...

最後の方で、静的型付けのおかげで全体に一貫性が生まれて、
生産性が上がったよとちょっとだけ書いてある
730デフォルトの名無しさん:2011/07/05(火) 23:22:56.93
ある程度の形が出来たあとのプログラミングでは静的型の利点もあるだろうが
仕様がコロコロ変わる時期には動的型か、静的型でも型推論くらいはないとやってられんかな
731デフォルトの名無しさん:2011/07/05(火) 23:27:39.26
仕様がコロコロ変わる時こそ静的型だろ。

動的型だと仕様が変わったとき、
ちょっと変えるだけで動く・・・ようにみえて
動いていないって状態になる。
動かせば動かすほどエラーが発生する。

静的型だと極端に変なコードだと動かないし、
一箇所変えるだけで、それに連動する場所を自動で変えてくれたりする
(リファクタイングブラウザ)
732デフォルトの名無しさん:2011/07/05(火) 23:43:21.61
それはお前がヘボだから
733デフォルトの名無しさん:2011/07/05(火) 23:48:14.07
つーか、動的型使ったこと無い土方は書き込むなよ
734デフォルトの名無しさん:2011/07/05(火) 23:49:44.66
ヘボにも使えるから安全なんだが
735デフォルトの名無しさん:2011/07/05(火) 23:50:38.56
あーなるほど
それは同意
736デフォルトの名無しさん:2011/07/05(火) 23:51:17.88
前例のないものはどのみち危険だが、前例があるなら付加価値でもつけるしかない
だからRubyで作ってJavaで作り直す
737デフォルトの名無しさん:2011/07/06(水) 00:04:31.66
動的言語が仕様変更に強いって
何の妄想なんだろうか?

変更があったとき、変更する箇所は
動的も静的も同じじゃん。

その上で、静的ならIDEで一括変更できるけど
動的はまず無理だからって話でしょ?
738デフォルトの名無しさん:2011/07/06(水) 00:08:30.88
そもそも動的に大規模プロジェクトは存在しないから
比較できないしな
739デフォルトの名無しさん:2011/07/06(水) 00:38:40.54
はいはい土方仕事頑張っててエライね
明日もIDEでリネーム作業頑張ってね
740デフォルトの名無しさん:2011/07/06(水) 00:50:51.39
リネームって言うか仕様変更ね。
静的言語は仕様変更に強い。

便利さに嫉妬して、馬鹿にするほどにw
741デフォルトの名無しさん:2011/07/06(水) 00:56:45.87
仕様変更への対処方法

静的言語:既存コードをIDEで書き換える(renameは静的型付け圧倒的有利、他は知らん)
動的言語:既存コードを動的に置き換える(duck-typing, monkey-patching)
742デフォルトの名無しさん:2011/07/06(水) 00:59:20.08
単純に置換するだけなら動的言語でも sed で事足りるけど、methodA の実装を分割して
methodM と methodN に分けた時に、methodA の呼び出しを使っている機能に応じて
methodM と methodN に書き換えるのは静的型付け言語でも無理。

単純な置換 → 動的言語でも可能
複雑な置換 → 静的言語でも不可能
743デフォルトの名無しさん:2011/07/06(水) 00:59:49.28
自分は基本的にCしか使わない人間なのだけど、
素朴に不思議なのが、動的言語使ってる人たちは、どうやってソースレベルでデバッグしてるのだろうか?

たとえば、ある動的関数f()が、実行時にa()やb()として動くとして、
ソースを読んだだけだと、実行時のある瞬間に、実際に実行されるのがa()なのかb()なのかの判断は難しいと思う。
すると当然専用のデバッガーを使うことになるのだけど、デバッガーを介さなければデバッグできないソースってのが、
はたして読みやすくて理解しやすいコードなのか?と本末転倒さを感じる。

動的言語の本来の目的は、ソースコードをより理解しやすく管理しやすいものにするためだと思うのだが、
それが本当に上手くいくのだとは信じられない。

たとえばコード中に、まったく振る舞いの違う同名の関数や変数、たとえばまったく振る舞いの違うprint()が大量に定義されてるとして、
このソースを人間が目視で読んでデバッグすることが、本当に容易だろうか?と。
逆に難解になってしまってるような気がするのだが。

たとえば複数種類のprint()があるとして、これら個々の関数にユニークな名前をつけることが、本当に悪なのだろうか?
という根本的な疑問を感じる。
a_print()やb_print()などユニークな名前を割り当てることが、本当にプログラムの難解さや保守の難しさへとつながるのだろうか?
信じられない。どう考えてもa_print()の方が保守管理しやすいコードになると思う。だってgrep a_print * がまさに動くよ。
744デフォルトの名無しさん:2011/07/06(水) 01:02:08.69
俺もCはよく使うけど、10行を超えるレスは頭に入らない
745デフォルトの名無しさん:2011/07/06(水) 01:05:38.91
静的型付き言語だと、

int foo(long bar, double baz, char qux)



void hoge(char *fuga, long fuu, double hoo)

に書き換えるのも簡単なんだろうなあ...

それとも引数の名前を変えたいなんて事は無い?
746デフォルトの名無しさん:2011/07/06(水) 01:09:16.76
>>743
そりゃー動的言語どころか、ポリモーフィズム自体を否定する感じだねぇ
ま、言いたいことは分かる

動的言語は実行速度が遅い分、Cと簡単に組み合わせて使えるように出来てる
だから、例えばCでプリミティブなモジュールを実装し、
関数ポインタ駆使して実装するようなコードを動的言語で書くと
いい感じになるよ
747デフォルトの名無しさん:2011/07/06(水) 01:18:51.72
>>745
リネーム(笑)って馬鹿にされてる中、それでもリネームの例を出す
そういうの嫌いじゃないぜ
748デフォルトの名無しさん:2011/07/06(水) 01:21:48.48
>>742
意味が良く解らんが、
メソッドの分割というか、メソッドの一部分を抜き出すことは
静的言語というかIDEの機能だがEclipseでできるよ。
静的言語がそういうコンパイル時の情報を持っているからこそなんだけど

関数の一部分を選択してメソッドの抽出を行うだけで
その部分を関数にして、引数と戻り値を適切に設定してくれる。
またその逆でメソッドの中身を、そのメソッドの呼出部分にインライン化もできる。

だから関数分割は以下のようにして行える。
1.methodAの中身を抽出して、二つの関数methodMとmethodNの呼び出しに変更する。
2.methoaAのインライン化を行う。一回の操作ですべてのmethodAの呼び出しをインライン化できる
749748:2011/07/06(水) 01:22:40.12
>>747
だからリネームじゃなくて、関数の統合分割の例を出しましたよw
750デフォルトの名無しさん:2011/07/06(水) 01:26:24.93
>>748
methodA を methodN と methodM に分割したとして、
methodA を呼び出していた側が methodN の機能を使いたいのか、
methodM の機能を使いたいのかを IDE で判別できるの?

って話。
751デフォルトの名無しさん:2011/07/06(水) 01:32:23.60
>>746
動的厨のほとんどは
そのような高度なことは出来ない
752デフォルトの名無しさん:2011/07/06(水) 01:32:44.21
>>750
少なくともmethodAをmethodNとmethodMに分割することはできる。
そして、methodAを呼び出している部分を適切に検索することもできる。
名前検索ではなくコードを理解しているから、使用している箇所を正しく判断できる。
ここまででも十分楽できたでしょ?
面倒なのはこういう機械的な分割なんだから。

それに今までmethodAを呼びだしていたのに、その一部のmethodNだけでよいとか
methodMだけでよいとかそういう修正が入ることはまず無いと思うんだが?
こんなことをしたら動きが変わってしまうのでこれはリファクタリングにはならないはず。
動作の修正はもちろん人間がやるべきところだよ。
753デフォルトの名無しさん:2011/07/06(水) 01:34:48.32
>>752
>そして、methodAを呼び出している部分を適切に検索することもできる。
>名前検索ではなくコードを理解しているから、使用している箇所を正しく判断できる。

それは grep や sed で充分だわ
結局リネームしか出来ないのね...
754デフォルトの名無しさん:2011/07/06(水) 01:35:13.43
> それは grep や sed で充分だわ

メソッド名が、getだったら?
755デフォルトの名無しさん:2011/07/06(水) 01:37:32.00
>>753
関数の統合分割できてるじゃん。
目が見えないの?

それとも、わ・ざ・と?w
756デフォルトの名無しさん:2011/07/06(水) 01:38:53.10
>>755
ただメソッド抽出/分解するだけなら動的言語でも可能
なんで変数の型付けが関係あると思ったの?
757デフォルトの名無しさん:2011/07/06(水) 01:39:11.72
>>754
それは get(foo) を getFoo() に変えたいとか、そういう話?
何が問題かもっと具体的に
758デフォルトの名無しさん:2011/07/06(水) 01:41:25.18
>>751
ぜんぜん高度じゃねぇwww
759デフォルトの名無しさん:2011/07/06(水) 01:41:36.34
>>756
可能かどうかじゃなくて、大変かどうかだろw

お前やってみたことあるのか?
関数分割は、単純にコピペすればいいって話じゃない。
関数で使われている変数をどうやって渡すかという話が残っている。

Eclipseを使えば数十行あるコードの中で使われているローカル変数を
ただしく、引数と戻り値に置き換えてくれるんだぞ。
動的言語だと、一行一行みて変数を引数に置き換えていかなければいけない。
760デフォルトの名無しさん:2011/07/06(水) 01:42:55.94
>>759
だから、それが何で変数の型付けと関係あるの?
変数のスコープが関係するのは分かるが
761デフォルトの名無しさん:2011/07/06(水) 01:43:38.75
>>757
プロジェクト内の複数のクラスでgetというメソッド名が使われていたとする。
このプロジェクトの中から○クラスのgetだけを抽出する方法を

grepで、grepで、教えてください。

重要なので二回言いました。
762デフォルトの名無しさん:2011/07/06(水) 01:45:54.91
>>760
変数の型付けとは関係ないよ。

でも、静的言語の話だろ?
静的言語は、変数の型付け以外の機能も持ってるんだよ。

静的型付け言語ではなく、静的言語ね。

コンパイラ(IDE)がコードを理解しているというのは
それだけコンパイラがコーディングのサポートを出来るということ
763デフォルトの名無しさん:2011/07/06(水) 01:47:36.56
>>761
実際、getter / setter を変える事ってあんまり無くね?

それが静的言語の最大のメリットなの?
get の rename が?
764デフォルトの名無しさん:2011/07/06(水) 01:48:02.10
ポリモフィズムに代表されるオブジェクト指向という概念は15年前くらいから流行りはじめたけど、
オブジェクトモデルなどという考え方自体が、実に馬鹿げてると思う。

物事を単純化しようとした結果、逆に複雑になってしまってる典型例だと思う。
一見しただけだと、単純化したように見えるので(ほら!同じ名前のメソッドで、いろんなオブジェクトを同じ操作で使えるよ!など)
なんとなく簡単になったように錯覚してるだけだと思う。
実は、この代償として、とんでもないデバッグの難解さを含めてしまってるのに。

実際は、多態性によって、分岐と、その組み合わせの可能性が爆発的に増えるのだから、
デバッグ時の推論すべき量も指数関数的に増えてしまう。
これがプログラム全体で行われるとしたら、まさに保守の悪夢だとしか思えない。

個人的に思うのは、
言語や、設計や、思想をいくら捻ったところで、
ある問題自体に含まれる潜在的な複雑性ってのは、けして消せないし、どんな組み方をしても形を変えてソースに残りつづけるような気がする。
ポリモフィズムのようなものは、その潜在的な複雑性を、単にデバッグの段階まで押しやってるだけな気がする。
だから一見ソースが単純明快になったように感じるけど、逆にその単純さがデバッグの時には複雑性として襲いかかってくるのだから、結局+ー0なのだと思う。

いたずらに単純さや明解さを謳う新たな言語や設計思想が現れたとしても、永久機関の話のように怪しいと思って疑った方がいいと思う。絶対にどこかに皺寄せが行ってるはずだと。
765デフォルトの名無しさん:2011/07/06(水) 01:48:43.46
>>763
質問の内容は正しく理解しましたか?

grepで教えてください。
766デフォルトの名無しさん:2011/07/06(水) 01:48:53.95
>>752
>それに今までmethodAを呼びだしていたのに、その一部のmethodNだけでよいとか
>methodMだけでよいとかそういう修正が入ることはまず無いと思うんだが?
>こんなことをしたら動きが変わってしまうのでこれはリファクタリングにはならないはず。
>動作の修正はもちろん人間がやるべきところだよ。

コードの修正の大部分はそういう作業だと思うんだけど、
IDEの自動化はあまり役に立たないみたいね...
767デフォルトの名無しさん:2011/07/06(水) 01:49:39.39
>>765
いえいえ、どうぞ get を置換する作業を続けて下さい
768デフォルトの名無しさん:2011/07/06(水) 01:50:19.64
>>762
動的言語でも型付け以外は静的に構文検査出来る以上、
型付けが関係ないなら違いは無いよ
769デフォルトの名無しさん:2011/07/06(水) 01:50:25.25
>>767
お前は置換することしか思いつかないのか?w

grepするときは、コードがどこから呼び出されているか
知りたいとかあるだろ?

お前さてはgrep使ったこと無いな?
770デフォルトの名無しさん:2011/07/06(水) 01:52:17.64
>>768
> 動的言語でも型付け以外は静的に構文検査出来る以上、
> 型付けが関係ないなら違いは無いよ

できるできないが問題じゃなくて、どれくらい出来るかということが重要。
動的言語は構文検査機能が貧弱なんだよ。
なぜならオブジェクトとメソッドの関係が薄いから
ただしくコードを理解することができない。
実行時にならないと分からない情報が多いし。
771デフォルトの名無しさん:2011/07/06(水) 01:53:06.76
>>766
> コードの修正の大部分はそういう作業だと思うんだけど、
> IDEの自動化はあまり役に立たないみたいね...

いや、だから機械で出来る部分が簡単になる分
人間の負担が減ってるでしょ?
772デフォルトの名無しさん:2011/07/06(水) 01:54:41.75
>>769
俺は getter で検索なんてしないけど、君はするの?
773デフォルトの名無しさん:2011/07/06(水) 01:55:49.47
手動でリファクタリングすることが
俺の仕事だって思っているから
それを機械化されると、こまるんだろうな。
774デフォルトの名無しさん:2011/07/06(水) 01:55:51.52
>>771
そんな些末な所で得しても嬉しくないんだけど...

道で5円拾っても嬉しくないでしょ
775デフォルトの名無しさん:2011/07/06(水) 01:57:27.60
折角メソッドの分割のネタを振ったのに、結局リネームの話に収束するんだなw
776デフォルトの名無しさん:2011/07/06(水) 01:57:29.52
>>772
じゃあ、君がこの間検索した関数名でいいよ。
777デフォルトの名無しさん:2011/07/06(水) 01:57:46.29
>>770
> なぜならオブジェクトとメソッドの関係が薄いから

これはまさに型付けの問題だよね?
で、duck typing がIDEによるメソッドの抽出/分解と何の関係があるの?
778デフォルトの名無しさん:2011/07/06(水) 01:58:26.31
>>774
> そんな些末な所で得しても嬉しくないんだけど...
>
> 道で5円拾っても嬉しくないでしょ

5円だという根拠は?

779デフォルトの名無しさん:2011/07/06(水) 02:00:08.16
以上、リネームは大事だよのセッションでした
780デフォルトの名無しさん:2011/07/06(水) 02:03:12.57
>>777
> で、duck typing がIDEによるメソッドの抽出/分解と何の関係があるの?

まずmethodAをmethodNとmethodMに分割する。
そしてmethodAが消える。
だがmethodAが他の場所から使われているかもしれない。

duck typingのせいで、methodAという呼び出しを見つけたとしても、
これが本当に今変更した(無くなった)methodAなのかわからない。
名前が同じだけど別物かもしれない。

で、grepじゃ正しく検索できないって話つながるわけかw
781デフォルトの名無しさん:2011/07/06(水) 02:04:34.81
>>780
静的型付けでも methodN に置き換えるのか methodM に置き換えるのか
決定できないから自動化は出来ませんねえ
782デフォルトの名無しさん:2011/07/06(水) 02:06:44.32
>>781
自動化ができるところとできないところを区別しよう。

それともお前は人間が要らなくなることを期待してるのか?
783デフォルトの名無しさん:2011/07/06(水) 02:07:30.81
自動化できる所 → 単純なリネーム
自動化できない所 → その他沢山
784デフォルトの名無しさん:2011/07/06(水) 02:08:10.73
>>783
なぜ今リネーム以外の例が出てるのに、
それをかたくなに見なかったことにしてるの?

わざと?
ねぇ、わ・ざ・と♪?
785デフォルトの名無しさん:2011/07/06(水) 02:08:57.91
>>784
getter の検索の話?

そっちでせめても無駄だと思うけどね...
786デフォルトの名無しさん:2011/07/06(水) 02:10:22.17
>>780
関数統合分割するときにも
高いメソッド識別能力が必要ってことだよ。

同じ単語を出すだけのgrep程度では話にならない
787デフォルトの名無しさん:2011/07/06(水) 02:10:26.03
methodMまたはmethodNどちらかを呼ぶ形式に書き換えるならともかく、
そうしないならmethodAを消す必要ないじゃん
methodMとmethodNに分割し、methodAからmethodMとmethodNを呼ぶように
書き換えたら良いだけ
788デフォルトの名無しさん:2011/07/06(水) 02:10:57.35
>>786
だから分割は無理じゃん...
789デフォルトの名無しさん:2011/07/06(水) 02:12:14.58
> そうしないならmethodAを消す必要ないじゃん

消す理由はコードの見通しを良くするためだよ。
無駄なコードを無くしてきれいにすることは、
汚いコードを残したままにするというのとは対極にある考え。
790デフォルトの名無しさん:2011/07/06(水) 02:12:21.91
>>787
それリファクタリングとして意味あるの?
791デフォルトの名無しさん:2011/07/06(水) 02:13:54.61
あと、一応確認しておくと今考えてるのってpublicメソッドだよね?
privateメソッドだと動的言語でもリネーム出来ちゃうからね
792デフォルトの名無しさん:2011/07/06(水) 02:14:57.44
>>780
よく分かった。

一見関係ないように見えることでも
名前を意味論的に正しく認識出来るってことは
重要なんだね。

動的言語では、たぶんこれ以上のコードをコンピュータが
理解することはできないと思う。限界。
793デフォルトの名無しさん:2011/07/06(水) 02:15:33.48
>>790
methodAが読み易くなるなら意味がある
むしろ、methodAをmethodMとmethodNの両方呼ぶように書き換えることに
メリットあるのか?
794デフォルトの名無しさん:2011/07/06(水) 02:15:44.09
>>791
まだリネームにこだわってるのかw
もう終わったぞ。
795デフォルトの名無しさん:2011/07/06(水) 02:16:35.17
>>793

> むしろ、methodAをmethodMとmethodNの両方呼ぶように書き換えることに
> メリットあるのか?

あるよ。methodAの中身がすごく長くなってしまった場合とか。

そもそもメソッドを分割したいってのは
動的言語厨がいいだした話だと思うがw
796デフォルトの名無しさん:2011/07/06(水) 02:21:17.85
>>795
はあ?
methodAが長くなったときに、その中身を分割するのは
読み易くするのに意味があるよ?
でも、呼び出し側を二つに分割して両方呼び出すのに何のメリットがあるの?
797デフォルトの名無しさん:2011/07/06(水) 02:26:05.51
>>794
いやぁ、だって普段publicなインターフェースをコロコロ変更しないからさ
静的言語で開発してる時でもさ
798デフォルトの名無しさん:2011/07/06(水) 02:28:05.17
>>796
メリットあるから二つに分割したいって
動的厨が書いたんじゃないのか?w
799デフォルトの名無しさん:2011/07/06(水) 02:29:19.94
>>797
コロコロ変更しないというか、
この程度のことでも変更したら、問題が発生するから
動的言語ではやれないってだけじゃないのか?

メソッドを使用している場所すら的確に
判断できないんだからね。
そりゃトラブルおきるよw
800デフォルトの名無しさん:2011/07/06(水) 02:32:11.58
まあ、リファクタリングを正しく実行出来ていないところは
「動いているコードを修正するな!」が原則だからな。

一度リリースしてしまえば完成な時代ならともかく、
今は「動いているコードを修正しながら改良させていく時代」なので
修正のしやすさの重要性はかなり高い。
801デフォルトの名無しさん:2011/07/06(水) 02:34:26.90
>>798
ちゃんと>>787読んでるか?読んでも理解出来ないのか?

methodAを二つの関数methodMとmethodNに分割し、
methodAをそれら二つの関数を呼ぶように書き換える
これはmethodAが読み易くなる場合があるから
分割すること自体は意味がある

一方、methodAを呼び出してる側のコードについて、
もしmethodMとmethodNの両方を呼び出すなら、
そのままmethodAを呼べば良いって言ってんの
802デフォルトの名無しさん:2011/07/06(水) 02:38:35.10
リファクタリングの原則ねぇ
「公開インターフェースはシステムの振る舞いと見なされる」から
変更するのはリファクタリングじゃないんだけどね

まあ、publicメソッド = 公開インターフェースかどうかは状況依存で、
オープンソースだと殆どイコールだけど
インハウスだと公開インターフェース?何それ?状態だよね
803デフォルトの名無しさん:2011/07/06(水) 02:44:18.69
>>801
それはメソッドのインライン化の目的を聞いているわけだよね?
リファクタリング本にその答えは書いてあるけど。

ぐぐれば見つかると思うけど、
手元にある本には、
「わざわざ名前をつけなくても意図が明らかなメソッドがある。」
という理由が書いてあるね。

こうやってインライン化することでメソッドの数が減らせるとも書いてある。
804デフォルトの名無しさん:2011/07/06(水) 02:46:54.01
>>802
そういう場合にも、これは本当に公開インターフェースであるべきなのか?
ってときも、privateにしてしまえば、
静的言語なら、コンパイルエラーでわかるし、
いろいろ便利なのにね。
805デフォルトの名無しさん:2011/07/06(水) 03:11:09.57
>>803
extract方向の、いわば抽象化のメリットは分かるけどinline化が
読み易さに貢献するとは思えないんだよね
特にpublicメソッドの中身を他のクラスのメソッド内に展開するメリットがね
動的言語だと、しょうもない関数はメソッドにせず最初からクロージャで書くからってのもある

それに、名前を一意に変換できない以上、
そのメソッド名は複数のクラスで定義されていて、namespace等では
判別不能な程ありふれてる名前なんだよね?getとかpushとかさ
そんな重要な名前を後でinline化するようなメソッドに付けるなよw
806デフォルトの名無しさん:2011/07/06(水) 03:12:01.39
>>802
> オープンソースだと殆どイコールだけど

それはオープンソースの ”クラスライブラリ” の話だな。

オープンソースでもプロジェクト内で閉じたクラス
(プロジェクト外で使うことを想定されてないクラス)なら
publicメソッドを変更してはいけない理由なんて無いし。


というか、大抵のアプリはライブラリ以外は
外部のプロジェクトで使われることを想定してないんじゃないか?
807デフォルトの名無しさん:2011/07/06(水) 03:13:39.31
> 動的言語だと、しょうもない関数はメソッドにせず最初からクロージャで書くからってのもある

なぜクロージャーがメソッドの代わりになるの?
変な使い方してそうだなw

> そんな重要な名前を後でinline化するようなメソッドに付けるなよw
未来のことは誰にもわかりませんよw
808デフォルトの名無しさん:2011/07/06(水) 03:17:31.87
>>807
名前付けるまでもない処理を纏めるのにクロージャ使うだろ
え?クロージャのある言語使ったこと無いの?
809デフォルトの名無しさん:2011/07/06(水) 03:19:07.17
>>808
え? 長い関数の代わりに
クロージャーを使うんでしょ?

methodAは長い関数、だから分割するって話なんだし。
810デフォルトの名無しさん:2011/07/06(水) 03:23:20.06
名前付けるまでもないならクロージャーなんか使わずに
{
 まとめたい処理
}

ってやればいいだけだと思うが?
811デフォルトの名無しさん:2011/07/06(水) 03:23:52.14
>>809
クロージャについてはinline化一般について言ってた
確かに長い関数についてはクロージャは使わん

でも、長い関数でかつ複数のクラスで使われてるようなメソッド名が
「わざわざ名前をつけなくても意図が明らかなメソッドがある」に
該当するとは思えない
具体例を挙げてくれれば納得もするが
812デフォルトの名無しさん:2011/07/06(水) 03:25:12.16
>>811
長い関数をリファクタリングした結果
もともとの関数が極端に短くなってしまった場合の話だろ。
813デフォルトの名無しさん:2011/07/06(水) 03:26:48.40
>>810
ですよねw

クロージャーは他の関数に渡すときに使うけど、
まとめたいだけには使わないなぁwww
814デフォルトの名無しさん:2011/07/06(水) 03:26:59.83
>>810
変数のスコープを分けたいけどブロックが深くなるのを嫌うときや、
同じ処理が(ループではなくて)複数回呼ばれるときとか、
クロージャ使う場面はいくらでもある
815デフォルトの名無しさん:2011/07/06(水) 03:27:50.82
> 変数のスコープを分けたいけどブロックが深くなるのを嫌うときや、
クロージャ使っても深くなるだろw
816デフォルトの名無しさん:2011/07/06(水) 03:28:28.27
> 同じ処理が(ループではなくて)複数回呼ばれるときとか、
纏めるだけの話限定なw
817デフォルトの名無しさん:2011/07/06(水) 03:29:15.79
>>812
へー、メソッドを消すかどうかを
意味的に分かり易いかどうかじゃなくて
「関数が長いかどうか」で決めるんだ?
複数のクラスで定義されてるような重要な名前のメソッドなのに?
818デフォルトの名無しさん:2011/07/06(水) 03:30:46.18
>>815
def f():
    def g(x):
        print x
    for i in range(100):
        for j in range(100):
            for k in range(100):
                g(k)
819デフォルトの名無しさん:2011/07/06(水) 03:31:34.94
>>817

> ぐぐれば見つかると思うけど、
> 手元にある本には、
> 「わざわざ名前をつけなくても意図が明らかなメソッドがある。」
> という理由が書いてあるね。

消すとしたら必然的に短い関数になるだろ。

使われ方じゃなくて、関数名で消すかどうか
決めるほうがおかしい。
820デフォルトの名無しさん:2011/07/06(水) 03:32:41.19
>>819
今は、「関数まとめるだけのためにクロージャーを使う」限定。
821デフォルトの名無しさん:2011/07/06(水) 03:33:51.31
訂正

「名前付けるまでもない処理を纏めるのにクロージャ使う」限定
822デフォルトの名無しさん:2011/07/06(水) 03:35:31.77
>>819
短い関数であることは必要条件であって十分条件じゃない
関数名はどう抽象化してるかを表してるんだから
リファクタリングにおいて消すかどうかに名前が重要なのは当たり前
目的は「コードを分かり易くすること」だぞ?
823デフォルトの名無しさん:2011/07/06(水) 03:36:21.19
じゃあ、名前は十分条件なのかよw
824デフォルトの名無しさん:2011/07/06(水) 03:38:12.43
>>822

必要条件・・・短い関数じゃない
十分条件・・・「わざわざ名前をつけなくても意図が明らかなメソッドがある。」

これで十分条件を満たしたが、
お前はの反論は、反論になってるのか?

名前がどうしたって?
それなに条件だよ?w
825デフォルトの名無しさん:2011/07/06(水) 03:38:52.38
短い関数であることが必要条件って言ってる以上、
名前だけでは十分条件に成り得ないのは
論理的に考えて分かるだろ?
826デフォルトの名無しさん:2011/07/06(水) 03:40:05.13
だから、十分条件は「わざわざ名前をつけなくても意図が明らかなメソッドがある。」 だろ

名前が重要だからってのは
いったい何の条件なんだ?
827デフォルトの名無しさん:2011/07/06(水) 03:43:48.96
>>824
主張は簡単だよ

複数のクラスで同じ名前が定義されてて、publicメソッドで、もともとは長い関数だった
そういう関数で「わざわざ名前をつけなくても意図が明らかなメソッド」であって
かつinline化したほうが分かり易くなる例はあるのか?ってだけ

個人的な経験として例が思い浮かばないだけだから、具体例があれば納得する
828デフォルトの名無しさん:2011/07/06(水) 03:44:09.49
>>818
> へー、メソッドを消すかどうかを

> 複数のクラスで定義されてるような重要な名前のメソッドなのに?


今消すと行っているメソッド名はmethodAだぞ。
複数のクラスで定義されているような重要な名前か?
829デフォルトの名無しさん:2011/07/06(水) 03:46:06.88
>>828
複数のクラスで定義されてないなら
動的言語でも安全に書き換えられるね
830デフォルトの名無しさん:2011/07/06(水) 03:46:43.62
>>827
お前話がごっちゃになってるだろw

> 複数のクラスで同じ名前が定義されてて、publicメソッドで、もともとは長い関数だった

消すという話になってるメソッド名はmethodA。

複数のクラスで同じ名前が定義されてるのは別の話。
831デフォルトの名無しさん:2011/07/06(水) 03:48:59.95
>>829
> 複数のクラスで定義されてないなら
> 動的言語でも安全に書き換えられるね

一番の問題点、

複数のクラスで定義されてない、
duck typingで呼び出されることもない、
実行時に追加されることもないってのを
どうやって証明するかってのを解決出来ればなw


それができないから動的言語は駄目で
実行しなくても分かる静的言語がいいって流れだろ・・・
832デフォルトの名無しさん:2011/07/06(水) 03:52:39.03
>>831
複数のクラスで/実行時に定義されてないかはgrepで分かるだろwww
833デフォルトの名無しさん:2011/07/06(水) 05:30:53.59
grep vs IDE
834デフォルトの名無しさん:2011/07/06(水) 07:18:28.58
コロコロって書いて寝てたらあらぬ方向へすごい進んでるな…
もうちょっと書き方を考えるべきだったか

俺が眠気眼で「仕様がコロコロ変わる」っつーたのは
そもそも要求仕様が固まっていないレベルな
835デフォルトの名無しさん:2011/07/06(水) 07:53:42.05
リファクタするったって、テストコードくらい走らすだろう……
あとリファクタを話すならsmalltalkの事もたまには思い出してやってください。
836デフォルトの名無しさん:2011/07/06(水) 08:13:35.77
EclipseもSmalltalkで作ったのをJavaで作り直したんだよな。

なぜ、お手本がないと安全なソフトは作れないのかというと、
相対的に優劣をつけることしかできないからだろう。
絶対的な安全が保証できるなら他のものと比較する必要はない。
837天使 ◆uL5esZLBSE :2011/07/06(水) 08:20:39.64
Rubyバカにしてる子ってさ
変数に$ついてる言語触ってるって事だよね

いちいちSHIFT+4キーおして $ 打ちまくってる感触はどう?


死ねゴミ
838デフォルトの名無しさん:2011/07/06(水) 08:27:07.77
>>835
問題は、そのテストコードが信用できるかでしょ?

テストコードはバグがあることを証明できても
バグがないことは証明できない。

テストコードそのものが不足していれば、
その部分のテストはできない。
839デフォルトの名無しさん:2011/07/06(水) 08:30:02.41
>>832
> 複数のクラスで/実行時に定義されてないかはgrepで分かるだろwww
関数名でgrepする。
もしその関数が一つしか見つからなかったら話は簡単。

でも普通は複数見つかる。
複数見つかったとき、これが複数のクラスで定義された関数なのか
それとも一つのクラスの関数なのか、それを見分けることはできない。
840デフォルトの名無しさん:2011/07/06(水) 12:05:13.15
古いバージョンをすぐ消してしまうのはよくない
vistaを思いついた瞬間にxpを消すようなやつが安全なわけがない
841デフォルトの名無しさん:2011/07/06(水) 14:02:55.64
>>839
変数の型付けが静的だろうが動的だろうが、クラス定義はあるわけで
そこ見れば同じ名前のメソッドが複数のクラスで定義されてるか分かるだろう
まったく意味不明過ぎる
Java以外使ったこと無いから想像で書いてるだろ
842デフォルトの名無しさん:2011/07/06(水) 14:43:11.84
Javaのライブラリは簡単に古いメソッド消さないようにしてるのに
土方ときたらしょーがねーな

http://download.oracle.com/javase/6/docs/api/deprecated-list.html
843デフォルトの名無しさん:2011/07/06(水) 20:14:15.83
静的型厨がよく言う
「型整合が検査できればバグのほとんどを発見できる」とか
視野が狭いとしか言いようがない。
バグの過半数は仕様の間違いと仕様の間違った理解が原因だ。
844デフォルトの名無しさん:2011/07/06(水) 20:22:58.32
>>843
後者はともかく、前者は間違ってても仕様は仕様だろ

良くあるだろ?
これバグじゃね?不具合じゃね?と聞いたら「仕様です」って答えが帰ってくるの。あれだよ
845デフォルトの名無しさん:2011/07/06(水) 20:51:06.06
>>843
動的型付け言語がこれだけ普及している中で、静的型付けが無いと
仕事ができないと主張するには、それくらいの事は言わないとな

設計意図にまつわるバグについては、一切無視
話題がそちらの方向に向かいそうになったら、全力阻止
846デフォルトの名無しさん:2011/07/06(水) 23:14:07.49
>>841
> 変数の型付けが静的だろうが動的だろうが、クラス定義はあるわけで
> そこ見れば同じ名前のメソッドが複数のクラスで定義されてるか分かるだろう

的外れ。

問題は同じ名前のメソッドが複数のクラスで定義されていることを知った後の話だよ。

たとえばfooという名前のメソッドが複数のクラスで定義されていました。
さてobject.foo() はどのクラスのfoo()でしょうか?

grepしたらfoo()を使っている所が50箇所見つかりました。
あなたはどうやって、fooとクラスの対応表を作りますか?

847デフォルトの名無しさん:2011/07/06(水) 23:15:18.89
>>843
> 静的型厨がよく言う
> 「型整合が検査できればバグのほとんどを発見できる」とか

あ、それ捏造だよw
俺がついた嘘。
848デフォルトの名無しさん:2011/07/06(水) 23:22:05.93
バグのほとんどを発見できるは聞かない
聞くのは動的言語よりバグを発見しやすいとかそんな感じ
849デフォルトの名無しさん:2011/07/06(水) 23:23:44.72
>>848
聞かないことはないだろ。
絶対聞いたことがあるはずだ。

なぜなら俺が言ったからね。(ただし捏造w)
850デフォルトの名無しさん:2011/07/06(水) 23:24:00.38
MLみたいに型がガチガチな言語だと
コンパイルが通ればかなり安心できる
びっくりするぐらいまともに動く

もっとも、コードが意味的に間違っているケースは検出できないので
まあそこは仕方ない、テストが必要だよねっていう感じ
851デフォルトの名無しさん:2011/07/06(水) 23:30:51.57
テストを実行前テスト(静的テスト)と
実行時テスト(動的テスト)に分けるという考え方があるよ。

動的テストは実際に動かさないといけない。
ソフトウェアが自動的に動くことはなく、
人間が動かさないといけない(コードを書いて動かすのも含む)
そうなるとテスト作成のための時間がかかるし品質は人間に依存してくる。

静的テストは動かさない状態でやるので
ソフトウェアで自動化できる。

静的テストで完全にテストできるわけではないけれど
動的テストでやる作業を減らすことはできる。
852デフォルトの名無しさん:2011/07/06(水) 23:40:45.51
>>846
そのメソッドを持つクラス全てが対象となり得る、でよくね
853デフォルトの名無しさん:2011/07/06(水) 23:46:23.98
世迷言いってるのがいるなあ
854デフォルトの名無しさん:2011/07/07(木) 00:18:03.65
いよいよ、scalaが最強という説が一般化されつつあるな
855デフォルトの名無しさん:2011/07/07(木) 00:28:21.67
用途に応じて、使える言語の中から一番良い言語を選ぶだけだけどなあ

・動的型付け言語を使うと能率が上がるプログラマ
・静的型付けじゃないと文句を言うプログラマ
・動的型付けでも静的型付けでもガシガシコードを書くプログラマ

どれになりたい?
856デフォルトの名無しさん:2011/07/07(木) 00:29:57.52
仕様が漏れても動くものを作ってくれるプログラマを口頭で指示するSE
857デフォルトの名無しさん:2011/07/07(木) 02:29:53.40
> ・動的型付け言語を使うと能率が上がるプログラマ
能率は上がらない

> ・静的型付けじゃないと文句を言うプログラマ
静的言語が優れていると言ってるだけ、それに文句を付けてるのが(ry

> ・動的型付けでも静的型付けでもガシガシコードを書くプログラマ
ガシガシコードを書き、そして静的言語の優位性を語ってる。
両方使っているからよく分かってる。
858デフォルトの名無しさん:2011/07/07(木) 02:35:15.18
そういや、動的言語が開発効率がいい理由が
ひとつも出てなかったよね。
859デフォルトの名無しさん:2011/07/07(木) 02:56:10.44
>>764
別にOOがプログラミングを単純化したと主張している人はいないと思うけど。
分析・設計行程ややこしくなったけど、それに見合うメリットが存在しているから使っているだけ。

組み合わせ爆発は杞憂というやつだと思う。
可能性だけで存在しない組み合わせまではテストは必要ないわけだし。

foo(Hoge hoge)というシグネチャのメソッドがあったとして、
hogeオブジェクトにはHoge型としての振る舞いが期待される。
fooメソッドを使う場合には、それを満たすオブジェクトを渡すべきなわけ。
親クラスとは全く異なる妙な挙動をするサブクラスのことなどは気にする必要はない。
C言語でも型キャストすればコンパイル通るけど、
例えばintをdoubleに型キャストして引数渡されたときの挙動まで面倒みないよね?
860デフォルトの名無しさん:2011/07/07(木) 06:50:45.76
>>858
動的型言語の良さは、書き起こしやすさだと思う

型の依存関係、整合性はおぼろげなままでやってける
型変換は自動で済ませられる部分はそれでいいし
ライブラリもベスト・エフォート型が大半を占める
古き時代からメモリ管理は自動が当たり前だったからそれもほぼ無い

だからこそ、最もプログラミングの本質的な部分に集中出来るのよ
アルゴリズムだったり、フローだったりするが
思考が本質以外の部分に寸断されることが少ない、だからこそ書き起こしに向く
その上で厳密性を持たせたい部分には持たせられるから
安全なコードだって充分に書けるしな

多人数開発に静的型言語のが良いのは分からんでもないよ
ただ思考は寸断されたくないな、そここそがプログラミングの本質なんだから
861デフォルトの名無しさん:2011/07/07(木) 07:18:47.78
>>857
クロージャについて>>813>>815みたいなアホなこと書くやつが
動的言語でガシガシ書いたことあるはず無いだろw

それに型付けとスコープも混同してるし>>759
型付けの強弱と静的動的の違いも分かってない>>562
まさにJava以外のプログラミングというものを理解してない真性の土方だよ
862デフォルトの名無しさん:2011/07/07(木) 07:22:25.70
>>764
Pythonの場合だと多態が必要無い場合は
普通の関数を定義することが多い(OOP機能が後付けだからかもしれん)
関数はモジュール名+関数名で一意に定まるから
まさに grep module.func * が機能する
863デフォルトの名無しさん:2011/07/07(木) 09:13:14.62
>>857
どの動的言語でガシガシコードを書いてたのか詳しく
864デフォルトの名無しさん:2011/07/07(木) 14:18:53.64
>>846
何が的外れだアホ
無知をばらされたからって勝手に問題設定変えるな
865デフォルトの名無しさん:2011/07/07(木) 14:48:16.52
その話はもう秋田
それより>>863のが面白そう
866デフォルトの名無しさん:2011/07/07(木) 14:52:20.83
>860
型推論付きの静的なら思考の妨げなく書きなぐれるよ
867デフォルトの名無しさん:2011/07/07(木) 15:58:38.34
>>866
Haskellはそうゆうところあるよね。構造体の記述にしてもあれほど
素直な言語はないかもしれない。

Lisp系もそうだけど>>860のイッてることはよく分かるよ。Lisp系なら最適化
するときに型をつけ出すから。最初の思考をまとめる過程と最適化する
過程が上手に分けられるのが魅力だよね。Java/C++とかって、くだらない
雑務的プログラミングが多すぎてイラッとくる所がある。あんな
スパゲティーメイカーのどこがええねんと思うもの。

LispにしてもHaskellにしても少人数向けだとよく言われてるよね。
経験的に言えるけど、LispやHaskellって記述する前に熟考すること
のほうが多い。考える時間のほうが長い言語だってのは誰かが言ってた
けどそのとおりだよ。
Javaとかがなんで大人数向けなんかよく知らんねんけど。
868デフォルトの名無しさん:2011/07/07(木) 16:05:33.01
でもね。関数型言語で効率的に作っていける人ってのは
"最小単位"をしっかり分けられる人だよね。ひとつの関数に
いくつものことをやらせる人は効率は上がらないし、そうゆう人
って手続き型の癖が抜けてないとも言える。

いずにしても最初は最小単位で上手に作って、トレースと
プロファイラを使って段々完成へと固めていくってなるよね。

最適化の結果なら別だけど、ひとつの関数に5行以上かける
というのは関数型言語のプログラミングに慣れていないと考
えていいよ。
その結果関数が山ほど作られるから、大人数だと把握が大変
になるってのは少人数向けになりやすい結果なんだろうね。
869大天使 ◆uL5esZLBSE :2011/07/07(木) 17:48:22.42
なんで動的言語スレで、ゴミ関数型言語の話になってんの

つうかいつものHaskell野朗か死ね
870大天使 ◆uL5esZLBSE :2011/07/07(木) 18:00:55.33
なんでコンピュータ関係って<知ったか>がわいてくるんだろうな

頭が悪いんだったら、世の中で一番、多くの人が使ってる道具使ってればいいんだよ
わざわざユーザー少ないもの触っても、平均以下にしかなれねーよ

使用ユーザー数が少ないけど、実は先進的なもの っていうのは存在する
しかしwwwwwww それは関数型言語ではないwwwww

関数型言語は、もう1980年代に終わってる  
ゴミ言語さわっていることを自慢されても
分かってる奴の前では、関数型なんてほざいても大恥かくだけだから、黙ったほうが良い
871デフォルトの名無しさん:2011/07/07(木) 18:25:34.23
コンピュータ関係というかプログラミング関係じゃない?
872デフォルトの名無しさん:2011/07/07(木) 18:50:21.19
>>869
いつもの〜と言ってるけど、誰のことを指してるかわからん。
というより、知性がなさそうなコメントを見てると変なのに絡まれたな
というのが率直な気分ですね。
873デフォルトの名無しさん:2011/07/07(木) 19:08:29.81
短いスクリプト以外は動的型付け言語じゃなくて
型推論のある関数型言語がベストっていうのは、
個人的にはその結論でも良いと思うんだけど
このスレで暴れてるJava土方がその結論で納得するかね?
874デフォルトの名無しさん:2011/07/07(木) 19:16:20.70
>>873
原理主義者になってしまったら、結論ありきで論争をするからね。
無視していいと思うよ。<JAVA土方
875デフォルトの名無しさん:2011/07/07(木) 19:23:07.44
web土方のスクリプト厨に安全なプログラムは書けない
876デフォルトの名無しさん:2011/07/07(木) 19:28:37.04
>>868
そこまで高階関数たんをdisらなくても…
877デフォルトの名無しさん:2011/07/07(木) 19:30:11.73
>>876
むしろ、ベタ褒めに見えるがw
878デフォルトの名無しさん:2011/07/07(木) 19:46:53.83
>>868=>>877は高階関数を書けない可哀想なドカタ
だから単機能=沢山必要なんて馬鹿なカンチガイしている
879デフォルトの名無しさん:2011/07/07(木) 19:49:08.16
>>878
残念
>>877は私だが、今日はこのスレに初めて書き込んだ
880860:2011/07/07(木) 19:51:37.38
>>866
それは否定しないかな、なので書き直すと「型指定が必須な言語」が思考を寸断されるって感じかな。
881デフォルトの名無しさん:2011/07/07(木) 19:57:13.76
>>878
おっと、内容に言及してなかった
自分は高階関数を活かす関数作りの事言ってるのかと思ったんだが
882デフォルトの名無しさん:2011/07/07(木) 19:58:14.21
まあ型推論があっても type coercion が無い関数型言語では
型の整合性は意識するけどね
でもそこが良い
883デフォルトの名無しさん:2011/07/07(木) 20:02:22.23
>>880
わりと同意だけどケースバイケースな気がするな
>>60の例、C++だと>>135なんだが、C++における型の明示が
思考の妨げになってる気はしない
実際にはC++のコードに現れているようなネストされた辞書構造を
頭の中では考えているし、それを直接見たままに
表現しているC++のコードは(俺の感覚では)>>60よりずっと直接的で明快だ
まあ言語としてのC++を持ち上げる気持ちは毛頭ないけど……w

逆に、複雑でジェネリックなな高階関数みたいなものなら
型指定を避けたい気持ちは強いなぁ
884デフォルトの名無しさん:2011/07/07(木) 20:02:33.04
>>878
高階関数も無名関数として使っていれば、複雑なことを関数の中に
記述はできるしそれも良いんだけどね。これもなるべくシンプルに
という事は大切だよ。無名関数を組み込むときに大きなものを作る
のはその人のセンスの問題だと思うから、そんなに長くはならないよ。
高階関数を使って関数を返す関数を作れる人はやっぱり簡潔に書け
るようになるから>>868は別に矛盾しないんだよ。
行数が多くなるとしたら、Lispのマクロをいじる場合は仕方がないね。
これで複数のマクロや関数を作るマクロなんて作り出したらね。
これもコツがいるんだけど、抽象化による所が大きいそのために
熟考が必要になってくる。
885デフォルトの名無しさん:2011/07/07(木) 20:10:59.23
>>884
でも関数内で関数定義したりパターンマッチしたりすれば
普通に5行は超えるから、>>868は言い過ぎじゃね?
しょーもない関数でグローバルな名前空間使いたくないしさ
副作用のある式が5行以内なら納得する
886デフォルトの名無しさん:2011/07/07(木) 20:13:55.71
>>885
パターンマッチは行を使うねぇ。それはそのとおりだわ。
887デフォルトの名無しさん:2011/07/07(木) 20:16:01.20
>>885
let/whereはともかく、パターンマッチで5行超えるのは滅多に無い気が。。。
888デフォルトの名無しさん:2011/07/07(木) 20:29:01.34
OCamlでいうwhenとか、Lispでいうcondを使って
細かく条件分岐してると5行超えるねぇ
889デフォルトの名無しさん:2011/07/07(木) 20:33:27.52
>>888
lispは知らんが、OCamlならパターンマッチとガード併用で複雑な分岐も対応出来るだろ
890デフォルトの名無しさん:2011/07/07(木) 21:05:59.35
>>889
5行超えるような複雑な分岐に対応できるって言ってんじゃね?
891デフォルトの名無しさん:2011/07/07(木) 21:16:11.13
>>888
判定おながい
892デフォルトの名無しさん:2011/07/07(木) 22:29:22.50
動的言語が遅いのは
正規表現つかいまくりだからだろうね。
ただの文字列比較でいいのに
正規表現使うから。
893デフォルトの名無しさん:2011/07/07(木) 22:33:39.03
正規表現使う言語でも普通の文字列比較もできるのが普通だし
動的言語だからって正規表現が使えるものばかりじゃないぞ
894デフォルトの名無しさん:2011/07/07(木) 22:38:17.86
>>892
それは違うんじゃないか
テキスト処理はむしろ動的言語が得意な部類で、数値計算とかが圧倒的に遅い感じだ
895デフォルトの名無しさん:2011/07/07(木) 22:44:10.36
動的言語のいいところは、ライブラリに不具合があったとき
元のソースをそのままに、実行時に修正できるところ。

便利なんだけどただこれのテクニックを仕事で使うかといえば微妙。
896デフォルトの名無しさん:2011/07/07(木) 23:27:25.13
動的言語の正規表現は
静的言語で書かれたライブラリを呼び出すだけなんだから
遅くはならないわな
897デフォルトの名無しさん:2011/07/07(木) 23:29:47.29
>>891
言いたいことは>>890
そして条件分岐は可能な限りヴァリアント+パターンマッチを使って
型チェックを酷使するのが俺のジャスティス
898デフォルトの名無しさん:2011/07/08(金) 02:20:18.81
>>895
ライブラリは言語のパッケージ管理システムでインストールしているとき、
インストール済みのコードを直接修正したくないので
(修正バージョンのライブラリをプロジェクト用のSCMで抱えるのはなるべく避けたい)、
アプリ側コードの一部としてモンキーパッチで不具合を修正というのはたまに仕事でもやる。
899デフォルトの名無しさん:2011/07/08(金) 07:38:29.07
>>894
インタプリタになってる動的言語だったら数値計算が遅いのは当然
なんだが、その部分だけCのライブラリを活用しているものはおおい
よね。PDLしかりNumpyしかり。。正規表現も同じだよね。
でも、動的コンパイラ言語はまた別だよ。Common Lispのことは一度
調べておいたらいい。ちなみにCommonLispの正規表現ライブラリは
clppcreが有名だけど、純Common Lisp製でC製の正規表現ライブラリ
のPerlより速いというのは有名な話。
900大天使 ◆uL5esZLBSE :2011/07/08(金) 14:03:00.88
有名な話(キリッ)

CLは速いってネットの隅っこでは言われてるけど一般人はCLの知識なんてねーよ

100人つかまえて1人知っているかどうかなものを、あげられて 有名(キリッ)とかいわれても
おもいっきし キリッ じゃん
901デフォルトの名無しさん:2011/07/09(土) 07:03:25.30
「スレッドは悪くない、悪いのはそのようにプログラミングすることだ」
これの命題が真か偽か判断するには悪いの定義が必要だ
902デフォルトの名無しさん:2011/07/09(土) 07:31:24.02
>>899
アレがある種の局面で高速だと言われるのは
Common Lispでは型を付けられることと、コンパイラマクロを使えるのが要因であって
動的であることはあまりお関係ない

例えば、C++のテンプレートなら
同様に型付きで事前計算ができる

型ヒントのない動的型付けコンパイル言語というと、ErlangのHiPEとかだが
shootoutを見ると、静的型付け言語よりは一回り遅くなる傾向のようだ
903デフォルトの名無しさん:2011/07/09(土) 08:17:04.06
動的でも型がつける選択ができる言語というのがあるということは
知っておいたらいいんだよ。実際速度はC並にできるからね。ただ
高速にすると安全性も低下するからトレードオフを良く考えない
といけないがね。

型を付けないというのは遅くなるというのは当然なんだけど、その反面
柔軟性が得られることが捨てがたいポイントなんだよね。

動的言語敷いてCommon Lispの長所はREPLを再起動せずに稼動し続けられる
ところだからメンテで止めることがいらない。更新した関数はそこでそのまま
適用されるから(マクロが絡むと絡んだ関数ももう一度ロードする必要があるが。)
便利なんだよね。でも、ここに危ないところもあるのは事実なんですね。
(やっつけ仕事でバグフィックスした関数を速攻で作っても、その関数を
ファイルに置いておかないとまた同じ失敗を繰り返してそのことを忘れた上で
どこにバグがあるかわからなく混乱することがある。)

ミッションクリティカルなところでCommon Lispはじつは強いと言われるのは
動的コンパイル言語所以なんだけどね。Lisp最強厨が出るのもこの辺絡みなん
だけど、彼らの多くは実際にプログラムを組んでいない。本当はもっと作って
欲しいね。
904デフォルトの名無しさん:2011/07/09(土) 08:19:20.65
静的言語でつくったらいちいち再起動させないといけないけど、それが
一刻を争うようなところで使うものでは無理だよね。だから、大規模な
WebシステムなんてCommon Lisp向けなんだよね。ホントは。
905デフォルトの名無しさん:2011/07/09(土) 09:43:04.45
型を付けると安全性が低下するってのがおかしい
静的言語では型を付ける恩恵として安全になって速度も上がるのだが
906デフォルトの名無しさん:2011/07/09(土) 09:57:05.63
>>905
903が言う文脈では間違っていない
Common Lispで最大限の最適化をしようとすると、
実行時チェックを片っ端から省略することになる
つまりその部分は、安全性もC並になってしまう
907デフォルトの名無しさん:2011/07/09(土) 09:59:34.48
Cはコンパイル時に型チェックされるのだが
908デフォルトの名無しさん:2011/07/09(土) 10:32:38.36
>>907
整数演算のオーバーフローは?
配列の境界外アクセスは?
多くの動的型付け言語は実行時チェックを噛ませて
プログラムの状態が未定義にならないようになっている

そういう意味ではCよりは安全
静的型付け言語でも、実行時にチェックを行う言語もある
909デフォルトの名無しさん:2011/07/09(土) 10:39:05.13
>整数演算のオーバーフローは?
>配列の境界外アクセスは?

これらを考慮に入れても
実行時にも型チェックしないのよりは
よほど安全だわ
910デフォルトの名無しさん:2011/07/09(土) 10:56:52.37
型安全性を保障するそうしたチェックは単にやるかやらないか、あるいは
どれぐらい低水準かの話で、静的動的はあんまり関係ないような気がする

Cには実行時型情報は何も無いしチェックなどやらない、JavaやC#はやる
911デフォルトの名無しさん:2011/07/09(土) 11:15:41.80
このスレには型付けを理解してないアホが定期的に発生するが
型付けを理解すると死ぬ病気なのか?
912デフォルトの名無しさん:2011/07/09(土) 11:19:02.33
Cは安全性についてプログラマが全て責任を負う言語
でもそれがいい
913デフォルトの名無しさん:2011/07/09(土) 11:25:54.84
>>911
C、Javaを教える学校とかでは計算機科学とか、型理論に触れない事が多いから、「型とはCPU内部でのデータ表現の事」という理解が殆どじゃないかな?
914デフォルトの名無しさん:2011/07/09(土) 11:27:52.19
>>902
boost.regexは冗談のように遅かった気が・・・
915デフォルトの名無しさん:2011/07/09(土) 11:44:31.15
このスレで使う理論は、
「他店の方が安いならば、必ずその値段まで値引きする。ゆえに当店は最も安い。」
みたいな理論だから、計算機科学とか型理論とかぜんぜん関係ないね。
916デフォルトの名無しさん:2011/07/09(土) 11:44:57.26
じゃあ、ここらで静的型付けがあると何が出来るか
まとめておこうか。

・間違ったメソッド名を検出できる。
・間違った引数を検出できる。
・間違った戻り値を検出できる。
・仕様変更時に影響がある箇所を検出できる。
・コーディング時に型が持っているメソッド・引数を補完できる。ドキュメントのポップアップ表示もある。
・メソッド・変数名の変更時に、影響がある箇所を検出、自動的に変更できる
・クラスやインターフェースの継承時に、テンプレートを自動作成できる。

言語やエディタによって多少の違いはあるがだいたいこんな所
917デフォルトの名無しさん:2011/07/09(土) 11:51:47.75
>>915
X 関係ないね。
O 俺は理解していない。
918デフォルトの名無しさん:2011/07/09(土) 11:59:36.77
typedefして型を隠蔽とかいっときながら
実際にその型に対してどんな操作ができるかまったく定義しないから
結局実際の型を見なきゃ何もできないCの型体系が嫌い</ちらし>
919デフォルトの名無しさん:2011/07/09(土) 12:05:26.90
>>916
X だいたいこんな所
O 俺はこれだけしか想定していない
920デフォルトの名無しさん:2011/07/09(土) 12:08:41.10
>>916
「コンパイル時に」の一言は抜いちゃダメよ
実行時なら動的だろうが出来ることは多いんだから
921デフォルトの名無しさん:2011/07/09(土) 12:38:38.47
>>916
>・間違った引数を検出できる。
>・間違った戻り値を検出できる。
間違った、じゃなくて間違った型な

>・仕様変更時に影響がある箇所を検出できる。
曖昧すぎ。仕様変更と一口に言っても色々ある

>・メソッド・変数名の変更時に、影響がある箇所を検出、自動的に変更できる
変数だけなら宣言必須であれば動的型付けでも可能

>・クラスやインターフェースの継承時に、テンプレートを自動作成できる
別に静的型付けだからってわけでは無いし
そもそも動的型付けだとあんまり要る機能ではないと思う
922デフォルトの名無しさん:2011/07/09(土) 12:45:08.73
>>921
動的言語には型がないのだから
「間違った型」というものがないよ。

明らかに想定外の値を検出できる。
もし動的言語なら正規表現とかで
関数の頭で引数チェックをするような所。
923デフォルトの名無しさん:2011/07/09(土) 12:48:08.96
文字列のバリデーションは静的言語も動的言語も似たようなものだし
(いわゆる)動的言語は変数に型が無いだけで
データ自体は型を持ってるよ
924デフォルトの名無しさん:2011/07/09(土) 12:50:57.74
静的言語は便利だよね。

たとえば関数の引数が一つ追加することになったとき、
定義を一箇所、引数を追加するだけで、
それにともなって修正しなければいけない場所を
瞬時に知ることができる。
925デフォルトの名無しさん:2011/07/09(土) 12:55:19.75
>>922
型の無い動的言語ってのを挙げてもらおうか。動的言語と呼ばれる言語の多くは型を持ってるのだが。
926デフォルトの名無しさん:2011/07/09(土) 13:12:04.53
927デフォルトの名無しさん:2011/07/09(土) 13:22:25.06
型付けを理解していない人の多くは
動的静的どちらか一方しか使ったことがないと以前農林水産省の統計で
928デフォルトの名無しさん:2011/07/09(土) 13:29:00.21
>>916
お前>>857と同一人物だろ
>>863の質問に答えてやれよ
929デフォルトの名無しさん:2011/07/09(土) 15:31:15.42
対立したことを対象にすると宗教論に落ちていくんだよね、最後の方で...
930デフォルトの名無しさん:2011/07/09(土) 15:36:43.69
>>922
『型が有るか無いか』と、『動的型付けか静的型付けか』はレイヤーが異なる問題だぞ
最近の動的型付け言語の殆どは型を持っていて、それが実行時に評価されるという仕組み
931デフォルトの名無しさん:2011/07/09(土) 16:03:04.93
実行前に分かることを、実行するまでわからない言語は駄目だろw
932デフォルトの名無しさん:2011/07/09(土) 16:05:24.60
>実行前に分かることを
それ、コンパイラっていうんじゃあ
933デフォルトの名無しさん:2011/07/09(土) 16:07:55.19
静的型だと詐欺程度のREPLしかついてこないからダメだな
934デフォルトの名無しさん:2011/07/09(土) 16:14:06.05
ScalaのREPLはメソッド補完とかもやってくれていいよ
935デフォルトの名無しさん:2011/07/09(土) 16:25:21.19
JVM系の言語のREPLは起動もレスポンスもものすごく遅いじゃん
あれじゃ気軽に試すレベルにない

そもそもREPLのない言語ってのは教育的効果が恐ろしく低いんだよ
実際静的言語の質問スレでは単体で完動するコードが貼られることが少ない
これは試すのが面倒だからだ
答える側が面倒なものを質問する側がどうやって


ごめんもう疲れた。煽り口調の文章は自分には無理だとさとった
936デフォルトの名無しさん:2011/07/09(土) 16:26:44.07
>>932
いくらコンパイラが優秀でも、
実行前に判別不可能な文法の言語では
どうやっても実行前テストにかけることはできん
937デフォルトの名無しさん:2011/07/09(土) 16:27:44.62
> そもそもREPLのない言語ってのは教育的効果が恐ろしく低いんだよ

なんでぇー?
938デフォルトの名無しさん:2011/07/09(土) 16:29:40.14
> 実際静的言語の質問スレでは単体で完動するコードが貼られることが少ない
> これは試すのが面倒だからだ

完動することが重要なのか?
939デフォルトの名無しさん:2011/07/09(土) 16:29:46.16
式単位で実行出来ると色々捗るからじゃないの
940934:2011/07/09(土) 16:32:14.03
起動は遅いけどレスポンスは全くそう感じないけど
他のJVM系のはレスポンスもおそいのかな?
Scala以外のJVM系っていうとGroovyとかClojureとか?
941デフォルトの名無しさん:2011/07/09(土) 16:33:25.33
別になにも捗らないけど。

一行で済むような、些細なコードで困ることなんてまずなく、
どっちみち実用的なコードは
複数行になるんだから。
942デフォルトの名無しさん:2011/07/09(土) 16:39:44.36
PythonやRubyのREPLは関数やクラスも定義できるよ
Erlangは制限が多くてちと面倒だった

>>940
前試したときはClojureはScalaに比べたら早かった
でもnailgunとか入れてたからだろうなあ
(Scalaは.jar落っことして置いただけ)
943デフォルトの名無しさん:2011/07/09(土) 16:40:53.89
>>941
捗らない人が捗らないのは何でだろうな
不思議
944デフォルトの名無しさん:2011/07/09(土) 16:49:07.47
囲碁と一緒で、些細な場面では、
こういう場合にはこうするって決まってるから。

もっと大局(設計レベル)を見ているときはいろいろと
考えることがあるけど、そんなこんな掲示板で書ける程度の
些細なコードで悩まんさw
945デフォルトの名無しさん:2011/07/09(土) 16:50:43.57
単にREPLの使い方を知らないのかな?
946デフォルトの名無しさん:2011/07/09(土) 16:53:45.54
REPLが何なのか見当がついてないに一票
947デフォルトの名無しさん:2011/07/09(土) 16:57:23.53
Interactive Shell の有用性なんて説明不要だと思ったんだがなあ...
948デフォルトの名無しさん:2011/07/09(土) 17:22:48.38
あんまり使わないね。

一行づつ実行するのも、
エディタに書いて、ショートカットで実行するのも
あまり変わらないから。

一行づつといっても、途中で間違えて
最初からやりなおしたいことはよくある話しだし。

たぶんね、IDEとか使ってない人が
テキストエディタで書く→保存→エディタ終了→実行→やり直したくなった→最初に戻る
なんてやってめんどくさいと感じてるだけだと思う。
素直にIDE使えと。
949デフォルトの名無しさん:2011/07/09(土) 17:27:03.69
REPLを前提とした言語を使った事が無くても、gdbとかを使った事があれば
メリットは簡単に分かりそうな物なのに...
950デフォルトの名無しさん:2011/07/09(土) 17:30:14.43
ショートカットで泣いた
951デフォルトの名無しさん:2011/07/09(土) 17:31:09.44
F#のIDEはREPL付きだけど普通に便利だよ
952デフォルトの名無しさん:2011/07/09(土) 17:34:21.00
>>948
> テキストエディタで書く→保存→エディタ終了→実行→やり直したくなった→最初に戻る
viっていうシーラカンスみたいなエディタでも
ソースコード開いたままmakeして実行できるよ
あなたがIDEでやってるように
953デフォルトの名無しさん:2011/07/09(土) 17:34:42.66
彼は何で一行に拘ってるのかしら?
普通に複数行のプログラムも評価できる物なのに
954デフォルトの名無しさん:2011/07/09(土) 17:38:03.89
>>948
>途中で間違えて
>最初からやりなおしたい

line editor っちゅー便利な物がありましてね
955大天使 ◆uL5esZLBSE :2011/07/09(土) 17:49:31.36
REPLのあるなしはどうでもいいと思うんだけど

自分でテスト用のコードかけるテンプレ用意しておけばいいだけで

そっか、バカ君には必要なのかもしれないな
956デフォルトの名無しさん:2011/07/09(土) 17:52:23.84
>>948
>テキストエディタで書く→保存→エディタ終了→実行→やり直したくなった→最初に戻る
エディタはサスペンドするか、もう一個、端末を立ち上げて実行するだろ

>>949
emacsからgdb立ち上げたことないようなレベルのが、
gedit使って、うはっ、便利とかいってる頭が幸せなヤツじゃないの

drschemeで遊ばすぐらい、会社の新人研修にいれとけ
957デフォルトの名無しさん:2011/07/09(土) 18:06:06.54
>>956
今どきの端末はタブも使えるし、GUIのエディタ使う人はそもそも画面が別だしな
てか同画面でエディタ>実行>別コマンド...>エディタ>実行…ってやってたら履歴手繰るのが面倒だw
958デフォルトの名無しさん:2011/07/09(土) 18:15:41.87
>>949
> REPLを前提とした言語を使った事が無くても、gdbとかを使った事があれば

gdbよりもIDEの方が便利って話だよ。
959デフォルトの名無しさん:2011/07/09(土) 18:20:46.10
今どき IDE を使っていても REPL くらいは知ってるものだがなあ
960デフォルトの名無しさん:2011/07/09(土) 18:21:06.26
>>965
> emacsからgdb立ち上げたことないようなレベルのが、

それくらいはできるよw

要するにデバッガ使うってことでしょ?
ブレークポイントとか止めたい行をクリックして
実行して止めたりステップ実行したり
マウスカーソルを変数の上に持ってきて
ポップアップで変数の中身を見たりするのと

”同等レベル”

のことでしょ?
961デフォルトの名無しさん:2011/07/09(土) 18:21:46.72
IDEがあってもREPLは便利だよ、つまり両方ある言語が最高です
962デフォルトの名無しさん:2011/07/09(土) 18:22:04.72
御託並べてないで使ってみれば良いのに...
963デフォルトの名無しさん:2011/07/09(土) 18:23:53.02
>>961
> IDEがあってもREPLは便利だよ
機能的にかぶってるから、
便利だとしたらそれはIDEにREPLとしての
機能が足りない場合の話でしょ?

964デフォルトの名無しさん:2011/07/09(土) 18:28:30.08
IDEとは一体うごごごとなりそうな
965デフォルトの名無しさん:2011/07/09(土) 18:31:59.84
         ____/ ̄ ̄  
          / │ ̄\__     ゴゴゴ・・・
            /  
  
        ..     、      ,_    
        ̄\_/ ̄ ̄\/ ̄     ゴゴゴゴゴゴ・・・
    ___/ ̄へ√⌒l⌒´ ̄ ̄\_ 
    ´        /   \ 
  
  
      _   ./ ̄ ̄ ̄\    / 
    __ `ソ/ ─  ─  \/ ̄/  
      \/゚ (●)。 (●)  \/ rへ,ノ   うごごご
 __>-へ| i     (__人__)    |ノ  :.\_ 
      .:/从へ、.゚` ⌒´o.ノ从rーヘ_ 
    _::ノ    :ノ`⌒Y⌒´::  \ 
          .::┘   :│   ゚ 
966デフォルトの名無しさん:2011/07/09(土) 19:44:12.25
>>942
scalaのREPLは率直に言ってイラッとくるけど、ClojureのREPLは普通に使えるよ
速さが全然違う。Clojureはその場でコンパイルされる動的言語だけど、Scalaは
インタープリタだという違いもある。leiningen+Clojureなら補完は期待できない
けどCake+Clojureは補完は強力になる。apropos,doc,sourceを使えば、シェルで
使ってる感覚い近くなるしね。言語によってはREPLでtrace/debug/profileも使
えるからね。

IDEは静的言語向けだと思うよ。あれで動的言語を扱ってると動的言語の魅力は
かなり無くなる。
967デフォルトの名無しさん:2011/07/09(土) 19:52:18.66
静的でもHaskellのREPLはまだ使えるよ。一番使えるのはCommon Lispだと思うけどね。
RのREPLもそこそこ強力かな。REPLの良し悪しは開発効率にかなり影響するからね。
968デフォルトの名無しさん:2011/07/09(土) 20:02:53.04
IDEだけが心の支えの土方が
REPL > IDE って言われて発狂してるでござる
969デフォルトの名無しさん:2011/07/09(土) 20:03:16.13
REPL使ってないわ
970デフォルトの名無しさん:2011/07/09(土) 20:05:19.93
動的言語が優位なのは
静的言語がIDE立ち上げるのにかかる時間内で
作れるプログラムだけ
971デフォルトの名無しさん:2011/07/09(土) 20:08:28.15
つーかOCaml使ってるけどIDEなんていらんわー
IDEとか言ってるのドカタだけだろ
972デフォルトの名無しさん:2011/07/09(土) 20:12:28.38
>>966
> Clojureはその場でコンパイルされる動的言語だけど、Scalaは
> インタープリタだという違いもある。
逆じゃないかと思ったけど、そうでもない?
ちょっと調べてみる
973デフォルトの名無しさん:2011/07/09(土) 20:13:14.90
なーんで>>948のようなアホは使ったことも無いものを批判するかね?
たぶん動的言語も、エディタも、REPLも使ったこと無いだろこいつ
974デフォルトの名無しさん:2011/07/09(土) 20:14:15.33
REPLが勉強にいいのはなんとなくわかるな
例えばどっかのブログ見てちょっとしたコード片が載ってたりしてちょっと試してみたいなと思ってREPL起動するのと
IDE起動して新しいプロジェクト作って〜とかやったりしてさらに結果見るのに
ブレークポイント設置したりprintf付け加えたり〜するのじゃ手軽さが違う
975デフォルトの名無しさん:2011/07/09(土) 20:15:08.02
REPLと安全なソフト関係あるのか?
アホはおまえじゃないのか?
976デフォルトの名無しさん:2011/07/09(土) 20:17:39.09
それをいうならIDEと安全なソフト関係も関係無いが
977デフォルトの名無しさん:2011/07/09(土) 20:18:02.36
REPLはその場テスト実行環境でもある
少し書いてはREPLで動かしてテストする
こっちは型だけでなくロジックのエラーも捕捉可能だ

テスト駆動に役割が吸収される面もあるけど
978デフォルトの名無しさん:2011/07/09(土) 20:19:02.78
IDEはリファクタリングできますよ?
979デフォルトの名無しさん:2011/07/09(土) 20:20:42.26
TDDの方が書いたテストケース後に残って便利じゃね?
980デフォルトの名無しさん:2011/07/09(土) 20:21:31.15
IDEでできる「静的言語のみに可能な自動リファクタリング」って
publicメソッドのインターフェース変更だけ
981デフォルトの名無しさん:2011/07/09(土) 20:26:53.78
昨日までは関数型言語の型推論とか、
実行中のサーバに繋いでREPLプロンプト出して実行時コード差し替えとか
ちょっと面白そうな話題だったのに
今日来てみたらまたIDEの話になってたw
982デフォルトの名無しさん:2011/07/09(土) 20:28:30.26
>>922とか>>948のせいです
983デフォルトの名無しさん:2011/07/09(土) 20:28:58.95
>>972
scalaはscalac(コンパイラ)とscala(REPL)があるけど、この話では後者のことね。
ごっちゃになりやすいから
984デフォルトの名無しさん:2011/07/09(土) 20:34:54.23
>>983
ああそういうことか。お手数かけました
985大天使 ◆uL5esZLBSE :2011/07/09(土) 23:01:39.70
>>974
だから、それがアホでしょ
重いIDE使ってるのもアホっぽいし
それに、プログラミング集中期間とか俺PCつけてたらIDE(エディタ)はほぼ常時起動されてるけど
986デフォルトの名無しさん:2011/07/09(土) 23:03:14.54
その時、
987デフォルトの名無しさん:2011/07/09(土) 23:07:00.25
あぁIDEがREPLとちがって手軽じゃないからそういう工夫をしてると
988デフォルトの名無しさん:2011/07/09(土) 23:23:26.45
>>980
> IDEでできる「静的言語のみに可能な自動リファクタリング」って
> publicメソッドのインターフェース変更だけ

動的言語でまともに自動リファクタリングできるツール教えてよ。
Perlでお願いね。
989デフォルトの名無しさん:2011/07/09(土) 23:24:30.45
>>987
ただ起動してるだけだろw

emacsが重いから常時起動しているのと同じだ
990デフォルトの名無しさん:2011/07/09(土) 23:24:57.28
"いで"の話題はスレの質の低下に寄与するからもう話題にしなくてもいい
のでは?
991デフォルトの名無しさん:2011/07/09(土) 23:35:17.76
オブジェクト指向の腐った部分を直してるだけだろうからな。
スパゲティ屋さんが多いから重宝されてるんじゃ?
<リファクタリング
992デフォルトの名無しさん:2011/07/09(土) 23:35:41.40
インタラクティブ環境として最強なのは今も昔も Smalltalk だよね

開発環境は IDE の元祖的な存在だし、Workspace / Transcript で REPL の様な
対話的プログラミングも出来るし、Reflection 機能も充実しているし
993デフォルトの名無しさん:2011/07/09(土) 23:48:57.82
関数型言語はリファクタリングとは無縁な世界なの?
994デフォルトの名無しさん:2011/07/10(日) 00:05:57.95
つまり、このスレのIDE派の意見をまとめると、
動的言語の開発環境にも
常に裏で実行しつづけて型情報等を解析するシステム

DOKATA (Dynamic Object's Keyword And Type Analyzer)

が必要ってことですね。わかります
995大天使 ◆uL5esZLBSE :2011/07/10(日) 01:28:30.95
関数型言語は、バズワードだから 気にしなくていい
996デフォルトの名無しさん:2011/07/10(日) 02:14:53.91
> 動的言語の開発環境にも
> 常に裏で実行しつづけて型情報等を解析するシステム

それ作るのが不可能だから。
動的言語の欠点だよ。
実際に動かさないと型情報が判明しない。
997デフォルトの名無しさん:2011/07/10(日) 02:16:26.19
許容的である事が利点という事
998デフォルトの名無しさん:2011/07/10(日) 02:18:10.31
なんで動的言語厨房って
動的言語にはない便利な機能を、
土方機能なんていうの?

おまえのかーちゃんでべそ。レベルの
悪口にしか聞こえないんだけどw
999デフォルトの名無しさん:2011/07/10(日) 02:22:18.67
動的言語厨ってのはめんどくさがりなんだよ。

ちゃんと書けば、静的言語でも
実行時に変数に入っているオブジェクトの
メソッドを呼ぶようなことはできる。

だけど、少し手間がかかるからやらない。
(その手間があることでIDEの開発サポートとと速度と堅牢性が得られるのに)

めんどくさがりやだから動的言語厨はテストも書かない。
1000デフォルトの名無しさん:2011/07/10(日) 02:22:43.29
じゃ、おしまい
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。