SHIMS Profile
SHIMS

@shims_ag

537
Followers
1,220
Following
21
Media
499
Statuses

プログラミングを教えています。

Joined December 2023
Don't wanna be here? Send us removal request.
@shims_ag
SHIMS
7 months
「デザインパターン」という用語が30年以上前から存在します。 「設計」は英語で「デザイン」です。
@masuda220
増田 亨
7 months
設計の経験則を伝える方法として、設計パターンとして言語化してみる、というのがある。 パターンの説明(what)よりも、どういう場合(when)、なぜ(why)そうするかの言語化のほうが重要。そして、それが難しい。 whenとwhyをわかりやすく具体的に伝える難しさ。
1
0
13
0
0
5
@shims_ag
SHIMS
7 months
『プロになるJava』の下記の画像中の説明は、致命的な間違いです。 コンストラクタによってオブジェクトが生成されるのではありません。 new演算子によって、オブジェクトが生成されます。Javaによるオブジェクト指向プログラミングの基本中の基本です。
Tweet media one
2
21
33
@shims_ag
SHIMS
7 months
数年後に高校で「情報I」、「情報II」を学んだ中から、「プロのプログラマー」が出てきます。 Xにいるような「老害エンジニア」が吹聴するデタラメから、若い「プロのプログラマー」を守らないといけません。 そうしないと日本のITには未来がありません。
@shims_ag
SHIMS
7 months
非常に多くの人が誤解していますが「プログラミング言語」と「プログラミングパラダイム」は独立しています。
0
0
5
1
11
29
@shims_ag
SHIMS
8 months
@Pythonist19 おばあちゃんにマジレス失礼します。 配列やオブジェクトを表す変数には、メモリアドレスや、メモリアドレスの識別子である「参照」が代入されます。 配列やオブジェクトの変数が、constを付けて宣言された場合は、メモリアドレスや参照の変更が不可能になります。
2
3
25
@shims_ag
SHIMS
7 months
モダンな言語を使っていても、設計がまずければ、スパゲッティコードになります。 C言語のような伝統のある言語を使っていても、適切に設計すれば、理解容易性、可読性の高いコードになります。
0
0
8
@shims_ag
SHIMS
8 months
リスコフの置換原則は、置換可能になるように継承しましょう、という原則、言い換えると、指針を提供してくれています。 置換可能でないような継承をすると設計が壊れますよ、だから、置換可能にするという原則を守りましょう、という意味です。
2
0
3
@shims_ag
SHIMS
7 months
コーディングだけを行うコーダーという職種が無くなる確率が極めて高くなっていますね。
@t_wada
Takuto Wada
7 months
2028年までに生成AIベースのツールがソフトウェアテストの70%を作成。手動テストの必要性が減りカバレッジが向上。生成AIはレガシーアプリケーションのコードに対するリファクタリングも促進し、2027年までにコードの変換や開発タスクの50%が生成AIによって開始、実行される
0
18
166
0
0
1
@shims_ag
SHIMS
7 months
下記は高校の教科書で教えられているコードです。 Siten tokyo = new Siten("S01", "東京支店" , 389000) ; このコードは、右辺から先に実行されます。 (1) new演算子によって、JVM上のヒープメモリ上に動的にメモリ領域を確保します。これがオブジェクトの生成処理です。
5
6
9
@shims_ag
SHIMS
7 months
高校の教科書では、フローチャートを使って、制御構造を使うアルゴリズムを習います。 初心者ならば、ソースコードを書く前に、フローチャートで制御構造のアルゴリズムを書くはずです。 フローチャートが頭に入っているなら、下記のコードはアルゴリズムが違うことに気が付くはずです。 —— 処理A if
Tweet media one
@Javakky_P
Javakky //流石にそろそろ働く
7 months
@shims_ag はい、アルゴリズム自体が間違っていることは間違いありませんが、コードの入力時にミスが発生した場合、コード全体を読む他にどこでミスが発生したかを判断することは困難だと思います。 今となってはこのようなミスを起こすことはありませんが、初学者にとっては不便ではないですか?
0
0
0
1
0
2
@shims_ag
SHIMS
8 months
変数はメモリ上に確保して記憶領域の名前です。 その記憶領域に記憶されているデータ(ビット列)の「種類」を表す情報が「型」です。 数値、文字列などプログラミング言語に予め用意されている「型」がありますが、プログラマーが独自に新しい「型」を定義する方法も言語側に用意されています。
1
0
2
@shims_ag
SHIMS
8 months
プログラマーは、プログラミングという作業を行うスキルを有しているエンジニアです。 プログラミングには、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなど、プログラミングスタイルがあります。
@misaki_remogu
🌻山本美咲/Remogu(リモグ)アシスタント
8 months
「エンジニア」と「プログラマー」 お恥ずかしながら、違いがあまりはっきりとわかっていません。 どなたか教えてくれませんか、、、。
37
10
368
1
0
7
@shims_ag
SHIMS
7 months
Xを見ていると、メモリにデータを記憶するという、コンピュータの動作原理を理解していない人が相当数いるようです。 そのような人は、ソースコードを��いてはいても、コードの意味を理解せずに、動いたらOKと考えているのでしょう。
0
0
7
@shims_ag
SHIMS
8 months
ソフトウェアを起動すると、メモリ上には、たくさんのデータを読み込まれます。各データには、データの種類を表す「型」が割り当てられています。 例えば、ゲームならばCartという大分類の「型」を用意し、その要素としてMarioCart, LuigiCartという「型」を用意します。
1
1
7
@shims_ag
SHIMS
8 months
メモリ上のデータの種類を表す情報が「型」(type)です。 プログラミング言語側に組み込まれている「型」だけでなく、プログラマーが独自に「型」を定義する方法も用意されています。 struct、class、interface、type, enumなどを使って独自の「型」を定義します。
0
0
7
@shims_ag
SHIMS
8 months
2022年から高校の「情報I」は必須になりました。情報Iは、コンピュータサイエンスの基礎部分を含んでいます。この教育を受けた学生が社会に出てきたら、コンピュータサイエンスを知らないエンジニアは、置いてけぼりになる可能性が大です。
@k1_c_
🦄けい©︎:プログラマーアイドル🦄
8 months
「コンピュータサイエンスを学んでいないのであればエンジニアじゃない論」、相応に解像度が低く、情報がないんだよな どんな示唆があるのかというのもよくわからないので、マウンティングしたいだけな言説にしか思えておらず
2
0
14
1
0
6
@shims_ag
SHIMS
7 months
new演算子ではオブジェクト(インスタンス)を生成します。 コンストラクタというメソッドでは、オブジェクトの初期化を行います。 オブジェクトの生成と、オブジェクトの初期化は、異なる処理です。 この2つを区別しましょう。
3
1
7
@shims_ag
SHIMS
7 months
「例えば」と書きました。 プログラミングにも基礎となる原則はある、という例を、「例えば」という単語の後に続けました。 プログラミングが苦手な人は、文章をしっかり読む習慣をつけましょう。
0
1
6
@shims_ag
SHIMS
8 months
プログラマーならば、日常的に構造体やクラスを定義するという作業を行なっているはずです。その作業は独自の「型」を定義する、という作業です。 「型」はメモリ上のデータの種類です。 「型」を定義する作業は、メモリ上に記憶するデータの構造を定義する作業です。
0
0
4
@shims_ag
SHIMS
7 months
消毒してから注射する必要がある という主張に対して、正論の押し付けだ、という人は皆無です。 しかし、ソフトウェア業界では、 コードを書いたらテストコードも書く必要がある という主張に対しては、正論の押し付けだとか、理想論に過ぎない、と拒否反応を示す人が少なくありません。
0
0
4
@shims_ag
SHIMS
7 months
複数のデータを一まとめにしてメモリに記憶するための下記の「命令」を実行したときに「言語処理系」が行う動作を説明します。 Siten tokyo = new Siten("S01", "東京支店", 389000); まず右辺から実行され、「オブジェクトの生成」(インスタンス化)と「初期化」が行われます。
@shims_ag
SHIMS
7 months
先の(a)(b)(c)は「int型」のケースでした。int型は、1つのデータだけをメモリに記憶する「命令」です。 プログラミング言語には、複数のデータを1まとめにしてメモリに記憶する「命令」が用意されています。この「命令」では、「配列」、「構造体」、「クラス」などを使います。
0
0
2
0
1
4
@shims_ag
SHIMS
7 months
@MochinecoNonato リファクタリングは、プロダクトコード、テストコードを書く時に随時行う作業です。 期間を設けてプロジェクト化して行う作業ではありません。
2
3
7
@shims_ag
SHIMS
7 months
高校の「情報I」では、下記のような「CPUの動作」が教えられています。 クラスや学校に数人の優秀な高校生はこれを理解します。 現役のコピペエンジニアの大半は、下記のような内容について、考えたことさえ無いと思います。
Tweet media one
@shims_ag
SHIMS
7 months
数学、物理、化学、英語などの科目なら、教科書を読んだり、試験結果から、自分は勉強不足だなと、自己認識できる人がほとんどです。 しかし、プログラミングになると、多くの人が、自分は基礎的なことは正しく理解している、と思い込んでいます。 非常に不思議な現象です。
0
0
1
0
0
4
@shims_ag
SHIMS
7 months
「型」は、プログラミング言語の開発者が構文解析する為に考え出された概念ではありません。 「型」は、プログラミング言語の利用者が、ソースコードの可読性を高めるため、かつ、メモリ安全な堅牢なソフトウェアを開発するために存在します。
0
0
5
@shims_ag
SHIMS
8 months
コンピュータの基本構成は長年変わっていません。 入力装置、中央処理装置(CPU)、記憶装置(メモリ)、出力装置で構成されています。 このコンピュータに自動処理させるための命令を設計する行為がプログラミングです。 命令を抽象化すると、以下の2種類に分類できます。
0
0
5
@shims_ag
SHIMS
7 months
プログラミング言語を使ってアルゴリズムを記述する際の制御構造は、下記の3つです。 順次構造 選択構造 反復構造 複数の制御構造が並んだり、入れ子構造になると、ソースコードは複雑化します。 そこで、関数を使って、ソースコードを機能・役割ごとに整理します。
1
0
2
@shims_ag
SHIMS
8 months
@MochinecoNonato 自分でクソコードだと認識出来る人は有望です。 クソコードかどうか識別出来ない人が多いので。
1
1
6
@shims_ag
SHIMS
7 months
オブジェクトがクラスのインスタンスである、ということは理解してますか? Java言語仕様の4.3.1に下記のように説明されています。 4.3.1 Objects An object is a class instance or an array. The reference values (often just references) are pointers to these objects, and a special null
1
1
5
@shims_ag
SHIMS
8 months
日本特有のSIerというビジネスモデルだと、再開発したほうが人月が稼げるので、プログラムを再利用せずに、再開発時には捨ててしまうことが当たり前になっているのでしょう。
0
0
4
@shims_ag
SHIMS
7 months
高校の教科書では、変数tokyoには「メモリ領域への参照(アドレス)が格納される」と説明されています。 「メモリ領域」に記憶されているデータが「オブジェクト」です。
Tweet media one
@shims_ag
SHIMS
7 months
下記は高校の教科書の説明です。こちらが正しい説明です。
Tweet media one
1
3
3
1
3
6
@shims_ag
SHIMS
7 months
失礼ながら「老害エンジニア」と表現しましたが、実際は年齢は全く関係ありません。 コンピュータの動作原理を基盤とし、丁寧な論理的思考によって、コード(命令)を導出することが出来るかどうかです。 丁寧な論理的思考ができるかどうかは、年齢は関係ありません。
0
0
3
@shims_ag
SHIMS
8 months
struct (C言語, C++, Rust, Go) class (Java, C#, Python, Ruby, JavaScript, TypeScript, PHP) data (Haskell) というコードを見たら、メモリ上にデータを記憶する時に利用する「データ構造」を定義しているのだな、と理解してください。 struct, class,
1
0
4
@shims_ag
SHIMS
7 months
ソースコードは、コンピュータに対する命令が記述された文書です。 しかし、ソースコード自体は、ソフトウェアではありません。あくまで文書(ドキュメント)です。 ソースコードは「必ず」、コンピュータが理解できる機械語やバイトコードに変換されます。
0
0
4
@shims_ag
SHIMS
7 months
プロダクトコードのメソッド、関数の設計と、 その実行結果を自動テストするテストコードの設計、 が自力で出来るようになったら、プログラマーに一歩近づいたといって良いでしょう。
0
0
2
@shims_ag
SHIMS
7 months
そもそも継承は、共通処理の実装を再利用する目的で発案された仕組みではありません。 継承は、実行時に動的に実装を切り替えるために発案された仕組みです。 言い換えると、動的ディスパッチを利用して、ポリモーフィズムを実現するために、継承は発案されました。
@MinoDriven
ミノ駆動
7 months
継承使って共通処理を基底クラスに実装するのがなぜマズいか。目的が異なる共通処理が基底クラスに全部書かれてしまうから。そして継承型ごとに実行する/しないの分岐が大量に実装され複雑化してしまう。解決には継承ではなくコンポジション構造にすること。クラスを組み合わせて使う設計にすること。
2
57
431
1
0
4
@shims_ag
SHIMS
9 months
Google創業者のセルゲイ・ブリンとラリー・ペイジは、素人ではありません。
@igz0
いぐぞー ✈️ 旅するプログラマー
9 months
ハチャメチャに金を生んでるGoogleのクローラーのプログラムでさえ素人の大学生が書いた「クソコード」を金が儲かるようになってから、プロに書き直して貰った訳で「最初から完璧なコードを書いて儲ける」なんて夢物語だよ。 「金になるコード」は必ず書き直される。 たとえそれが綺麗なコードでも。
5
125
724
0
4
6
@shims_ag
SHIMS
8 months
メモリ上のデータを分類する情報が「型」です。「クラス」は「型」を定義するための構文です。 Javaはjava.lang.Objectクラス、C#ではSystem.Objectクラスという大分類(型)が存在します。 全てのメモリ上のオブジェクトはこの大分類(型)に属します。 Java,
0
0
4
@shims_ag
SHIMS
7 months
皆さんの職場でも、専門用語を使って、支離滅裂な話しをしている人がいると思います。 書店にいけば、様々なジャンルで、支離滅裂な内容の本が出版されていることも、皆さんご存知のはずです。 同様に、プログラミング関連でも支離滅裂な書籍があるので注意しましょう。
@shims_ag
SHIMS
7 months
『プロになるJava』という本も酷い出来ですが、 『ちょうぜつソフトウェア設計入門―PHPで理解するオブジェクト指向の活用』 という本も酷い出来です。 ソフトウェア設計、プログラミングについては、日本人が著者の書籍は買わないほうが良いでしょう。
1
0
0
2
0
4
@shims_ag
SHIMS
7 months
人により解釈が違うという主張は、プログラミングの理解が浅い人の典型的な言い訳です。 例えば、関数型プログラミングの純粋関数は、同じ入力に対して、常に同じ結果を返すようにプログラミングします。 これは、人による解釈の余地を排除しプログラムを堅牢にするための「原則」です。
0
2
5
@shims_ag
SHIMS
8 months
要件定義プロセス、基本設計プロセス、詳細設計プロセス、実装プロセスという開発プロセスに沿って考えると、確立されている設計論の意義が理解できるかと思います。 下記のソースコードの場合、「要件定義プロセス」の成果物として 「ハローワールドを表示する」
1
0
4
@shims_ag
SHIMS
7 months
従来の詳細設計書には、下記を記述していました。 機能要件名・ユースケース名 名前空間・コンポーネント名 ファイル名 モジュール名 構造体名・クラス名 関数名・メソッド名 関数・メソッドの引数と型 関数・メソッドの戻り値の型
0
0
3
@shims_ag
SHIMS
8 months
電流と電圧の関係を知らない人が、電気回路の設計という作業をすることはあり得ません。 しかし、ソフトウェアの場合は、変数がメモリ領域の名前であることを知らない人が、設計作業をしているケースがあります。
0
1
5
@shims_ag
SHIMS
7 months
日本では、コンピュータサイエンス(計算機科学)、ソフトウェアエンジニアリング(ソフトウェア工学)を学んだことが無い人が、書籍を書いたり、翻訳したりしています。 また、日本では受託開発の経験者が圧倒的多数なので、無意識に受託開発を前提にした説明、翻訳が見られます。
0
2
4
@shims_ag
SHIMS
7 months
Java界隈は「参照」と記述してるのに、「ポインタ」と読む人が、非常に多いですね。 言語仕様にも「ポインタのようなもの」という説明はあります。しかし「ようなもの」なので、ポインタではありません。
@orekyuu
おれきゅー
7 months
この説明のとおり変数tokyoがポインタであるならば hoge(tokyo); System.out.println(tokyo); void hoge(Siten s) { s = null; } としたときnullが出力されることにならないです?実際はそんなことないんだけど
1
5
6
1
0
4
@shims_ag
SHIMS
7 months
要件を上手く定義できるかどうかが、ソフトウェアプロダクトの成否の分かれ目です。 要件定義が下手だと、仮にリリースできたとしてもプロダクトは失敗します。 あまりに下手だと、プロダクトは完成さえしません。
@masuda220
増田 亨
7 months
要件は定義できるものなのかしら? 言語化や可視化を試みることはできても、厳密な意味、範囲、条件を記述することはできなそう。
0
0
4
0
0
4
@shims_ag
SHIMS
7 months
非常に多くの人が誤解していますが「プログラミング言語」と「プログラミングパラダイム」は独立しています。
@shims_ag
SHIMS
7 months
スパゲッティコードを防止するために、関数型プログラミング、オブジェクト指向プログラミングというプログラミング方法があります。
0
0
1
0
0
5
@shims_ag
SHIMS
7 months
関数型プログラミング言語のHaskellを使っていてるにも関わらず、純粋関数という「原則」を理解しないまま、とにかく動作させることだけ考えてコードを書くと、簡単にスパゲッティコードになります。
@shims_ag
SHIMS
7 months
数学、物理などの分野と同様に、ソフトウェアの分野、さらに絞るとプログラミングにも、人によって解釈が変わる余地が無い原則は存在します。 Javaを使うことはできるが、一方で、プログラミングには原則が存在することが理解出来ない人がいる、という典型的な例です。
0
1
1
0
1
2
@shims_ag
SHIMS
7 months
数学、物理、化学の分野なら、著名な書籍の内容を理解できないのは自分がまだまだ至らないから、と考える人がほとんどです。 しかし、ソフトウェアの分野では、著名な書籍の方に罪がある、自分の方が理解している、と考える人がいるのは不思議な傾向です。
@masuda220
増田 亨
7 months
懐かしい本がならんでいる。 いまから振り返れば、いろいろ功罪があるわけだが。
0
0
4
1
1
2
@shims_ag
SHIMS
7 months
ブラウザ上のGUIからRDBに対してのCRUD処理ばかりコーディングしてきた人は、プログラムがコンピュータに対する命令だという認識が欠落する傾向にあります。 こういう仕事ばかりしてきた人は、問題を解決するためにコンピュータに自動処理させるプログラム(命令)を設計する作業ができません。
0
0
1
@shims_ag
SHIMS
7 months
Javaの現役プログラマーは、高校で教えられている3つの「プログラムの基本構造」の「順次構造」、「選択構造」、「反復構造」を間違うことによる論理的なエラー と、 プログラミング言語の構文エラー の区別が出来ないようです。
2
0
3
@shims_ag
SHIMS
7 months
プログラマーであるにもかかわらず、コンピュータというハードウェアは、ソフトウェアがないと動かない、 という基本的な理解が欠落している人が見受けられます。 日本特有のSI、人月商売というビジネスモデルが、プログラマーの認知を歪めているのでしょう。
@shims_ag
SHIMS
7 months
コンピュータのメモリは、0と1で表現されるビットを記憶します。 メモリにはアドレスが割り当てられています。 多くのコンピュータでは、1つのメモリアドレスには、8個のビットを記憶する仕様になっています。 変数にデータを代入する命令をメモリに焦点を当てて説明すると、以下のようになります。
0
0
0
1
0
4
@shims_ag
SHIMS
8 months
#コーディング としていますが、そもそも「コーディング」と 「プログラミング 」は異なります。
@fumokmm
ふも
8 months
#コーディング >「コンピューターコードを理解するのは独特なことのようです。これは言語と同じではなく、数学や論理とも同じではありません」 これは意外!どうりでプログラミングをいくら勉強しても論理的思考(ロジカルシンキング)なんて身につかないわけだね。
6
24
72
0
2
5
@shims_ag
SHIMS
7 months
要件定義プロセスの成果物である機能要件は、ユースケース、あるいは、ユーザーストーリーという形式で記述します。 1つのソフトウェア開発プロジェクトでは、多数の機能要件が定義されます。
0
0
1
@shims_ag
SHIMS
8 months
変数を「箱」だと比喩を使って説明してしまうと、本当に「箱」だと考えてしまう初心者がいます。 同様に「オブジェクト」を「もの」だと説明すると、比喩ではなく、本当に「もの」だと考えてしまう人もいます。
1
0
2
@shims_ag
SHIMS
7 months
ソフトウェアの設計では、 こんなメソッドシグニチャを使って命令したら、この「型」のインスタンスを返す、 ようなモジュール、あるいは、クラスが必要だ、と決定する作業を行います。 この作業は、いくつかある詳細設計という作業の中でも、特に重要な作業です。
1
0
4
@shims_ag
SHIMS
7 months
new演算子を実行した時に、 Sitenクラスの定義情報にアクセスし、Sitenクラス内部で定義されているフィールドの「型」などの情報から、必要なサイズを決定します。
@kenz_firespeed
Kenji Matsuokaストトリとカブと時々ジスペケ
7 months
@shims_ag new 演算子が コンスタクタメソッドが実行する前に確保するヒープメモリ上の領域は何バイトなんでしょう? そこに "S01", "東京支店" , 389000 というデータを確保するというのだから なかなか興味深いです。
0
1
3
2
0
2
@shims_ag
SHIMS
7 months
自動運転も一種のAIですが、生成AIはソフトウェアそのものです。 ソフトウェアの重要性、価値は高くなる一方です。 プログラマーならば、ソフトウェアの重要性が高まれば、自分の価値も高くなるので好ましいことのはずです。
0
0
4
@shims_ag
SHIMS
8 months
手続き型言語を使っていても、手続き型プログラミングが出来ていない人、 関数型言語を使っていても、関数型プログラミングが出来ていない人、 オブジェクト指向型言語を使っていても、オブジェクト指向プログラミングが出来ていない人 は相当数存在します。
0
0
3
@shims_ag
SHIMS
7 months
「ユーザー定義型」が発案された理由の1つに、ソースコードの可読性を高めることがあります。 「ユーザー定義型」を定義するための代表的な構文がclass, interface, enumです。 ソフトウェア製品では大量の「ユーザー定義型」が必要になります。
@tako_no_tempura
海老の天麩羅
7 months
@sikimuOji @K69688184 @shims_ag いらない子なのね…
1
0
1
2
1
5
@shims_ag
SHIMS
7 months
extendsは、「親クラスの実装そのものを使い回す」ことを目的とした仕組みではありません。 全く逆です。 親クラスのメソッドの内部の実装コードを別の実装コードに切り替るために、extendsします。オーバーライドといいます。
@Javakky_P
Javakky //流石にそろそろ働く
7 months
@shims_ag 確かに一般に定義されている言葉ではありませんでしたね。 では改めて言い直すとして、extendsで表されるような、親クラスの実装そのものを使い回すような継承はアンチパターンですか?
1
0
0
3
0
2
@shims_ag
SHIMS
7 months
主に3つの「プログラミング方法」があると書きましたが、実際の多くの開発現場では、どの方法も行われていません。 方法論を正しく適用せずに、スパゲッティコードが作成されています。
@shims_ag
SHIMS
7 months
現在、商用ソフトウェアの開発で用いられている主な「プログラミング方法」としては、オブジェクト指向プログラミング、関数型プログラミング、手続き型プログラミングがあります。
0
0
2
1
0
3
@shims_ag
SHIMS
7 months
目の前の「class」をよく見ると、下記のようになっているはずです。 class  変数  関数 プログラミング言語が違っても、上記のように1つに「カプセル化」して定義されているはずです。 このclassをテンプレートとしてメモリ上に生成したデータが「オブジェクト」です。
@shims_ag
SHIMS
7 months
高校の「情報I」の教科書では、以下のように「オブジェクト」を定義しています。 —— 関連するデータ(変数) と それに対する操作(関数) を1つにまとめたもの。 ——- 「オブジェクト」はメモリ上に存在します。 驚くべきことに「オブジェクト」がメモリに存在することを知らない人が結構います。
Tweet media one
1
0
3
0
0
0
@shims_ag
SHIMS
7 months
あくまでもクラスは部品の定義(設計図)です。 部品���実体は、クラスをテンプレートとしてメモリ上に生成した「オブジェクト」(インスタンス)です。 このメモリ上の部品(オブジェクト)には、操作するための「インタフェース」(API)が備わっています。
@masuda220
増田 亨
7 months
業務系アプリケーションでは、金額、数量、日付などは、標準ライブラリの値ベースのクラスを部品として使った、アプリケーション固有の型システムを構築して、それらの型を使ってプログラミングすることが生産性と信頼性の向上につながります。
2
4
32
0
0
3
@shims_ag
SHIMS
7 months
規模は無関係です。 ソフトウェア製品、ソフトウェアサービスの開発なら、規模に関係なく、プロダクトコードとテストコードを書きながら、随時リファクタリングを行います。 日本のSIのように作業者やプロジェクトが分断されている商売では、リファクタリングを行うことさえも難しいのでしょうね。
@NEMNEMNENNNE
NEM NEM
7 months
@shims_ag @MochinecoNonato 超小規模で、自セクション内のリファクタなら、勝手にやれですが。。。
0
0
0
1
0
4
@shims_ag
SHIMS
7 months
「構造化プログラミング」とは、一言も書いていません。 やはり生成AIのほうが理解力が上です。
@MotoyasuYamada
やまもんチャリ走社長/ITで働く人の生涯年収アップとサードプレイスを実現します
7 months
一般的には構造化プログラミングとは「処理手順の明瞭化、平易化、判読性向上を目的にしたプログラミング��法」という定義であって構造体を使うことではありません
0
0
13
1
1
2
@shims_ag
SHIMS
7 months
「泥団子」という表現は密結合を意味する場合に使います。 ご提示の例は、あまりにも散らばり過ぎて、自分達でさえも全体像が把握出来ないことが課題になっているケースです。 「場当たり的」(アドホック)な開発を繰り返し、「断片化」し過ぎ、などという表現がよく使われます。
@masuda220
増田 亨
7 months
巨大な一枚岩にへばりついた無数の泥団子。 基幹システムにへばりついたエクセルシート、BIツール、ノーコードツール。 そうやって事業活動を回していく。
0
1
7
0
0
2
@shims_ag
SHIMS
7 months
int a = 1; というコードを実行すると、コンピュータはa が指すメモリ領域に1を格納します。 上記のコードは機械語に変換された上で実行されますが、機械語ではaにはメモリアドレスが割り当てられます。
0
0
3
@shims_ag
SHIMS
7 months
エンジニアの中には、「オブジェクト」だけでなく、「命令」という用語にも抵抗がある人が結構います。 コンピュータに対して「ファイル」を「開く」や「保存する」という「命令」を毎日しているはずです。 にもかかわらず、自分が書くソースコードの「命令」とは結びついてない人が多いようです。
0
0
3
@shims_ag
SHIMS
7 months
Javaのソースコードはjavacでコンパイルし、バイトコードに変換します。 そのバイトコードを、JVMという仮想マシンが読み込み、解釈して、機械語に変換します。 その機械語をCPUが実行します。
0
0
3
@shims_ag
SHIMS
7 months
釈迦に失礼です。あの人たちは、単なるプログラミングの苦手な人たちです。
0
2
4
@shims_ag
SHIMS
7 months
大いに関係あります。 オブジェクトを生成することを「インスタンス化」といますが、ここは理解できていますか? このあたりが理解できてないと、new演算子の言語仕様部分は理解できないので、確認しています。
1
0
3
@shims_ag
SHIMS
8 months
継承が複雑化をもたらすから、委譲に飛びつく、という安直な設計判断してしまう人は、どっちの方法でも、スパゲッティコードを産み出すと思います。
1
0
3
@shims_ag
SHIMS
7 months
『プロになるJava』の5.2.3では下記のような「オブジェクト」の定義がありますが、これは明らかに間違いです。 「オブジェクト」は「クラスの値」ではありません。
Tweet media one
@popSLer
ぽっぽ@SLer
7 months
@yusuke @morkoshiTaro @ymrkm ポチりました。また読んだら感想をポストさせて頂きます。
1
0
3
3
1
3
@shims_ag
SHIMS
8 months
Javaのクラスは全てjava.lang.Objectクラスを暗黙的に継承しています。 Javaを使ってプログラミングしているにもかかわらず、継承は使わないほうがよいなどとアドバイスする人がいたら、その人の意見は無視しましょう。
2
2
4
@shims_ag
SHIMS
8 months
フレームワークの使い方から覚えてしまった人のなかには、プログラミングの基礎知識が不足している人が少なくありません。 例えば、変数とメモリの関係が曖昧な人がいます。
0
0
4
@shims_ag
SHIMS
7 months
貴方個人が勝手に解釈している「実装継承」なる用語が、意味不明なんです。 Javaプログラマーは、自分が書いている日本語が、何を指しているのかを理解しないまま、日本語をコピペする傾向がありますね。 コードだけでなく、日本語も意味が分からずコピペしているんです。
@Javakky_P
Javakky //流石にそろそろ働く
7 months
@shims_ag 実装継承は継承の中でも不要ではないか?の問いに答えられていないような気がします。 狭い用語での便利・不便を議論する際に、全部合わせて継承なんだからいるでしょ!は議論を放棄していませんか?
0
0
1
1
0
3
@shims_ag
SHIMS
8 months
抽象クラスやインタフェース宣言は、「必要なケース」にのみ定義します。 したがって、ますばシンプルなクラスを定義することから始めましょう。 「必要なケース」の典型的な例は、既存のコードを壊さずに再利用しながら、 プログラムの振る舞いを変えたいケース あるいは、
0
0
3
@shims_ag
SHIMS
7 months
機能要件を満たすことを目的として、モジュールやクラスのインタフェースを設計する作業は、「詳細設計」と呼びます。
@naoya_ito
naoya
7 months
競プロのライブラリを自作するときに、関数のインタフェースがうまく抽象を表現できていると、そのインタフェース自体が思考のヒントになるというか、その方向にアフォードしてくれるところがありますね
1
0
10
2
0
3
@shims_ag
SHIMS
7 months
@yasuo_ozu 当方はvscode, Dev Container, ryeの組み合わせで解決しました。
0
0
4
@shims_ag
SHIMS
7 months
「コンストラクタ」は「メソッド」です。 「メソッド」の内部で、何かを「返す」場合は、「return」を使います。 しかし「コンストラクタ」で、 return {オブジェクト名}; というコードは書くと、コンパイルエラーになります。
Tweet media one
1
0
2
@shims_ag
SHIMS
7 months
下記は高校の教科書の説明です。こちらが正しい説明です。
Tweet media one
@shims_ag
SHIMS
7 months
『プロになるJava』の下記の画像中の説明は、致命的な間違いです。 コンストラクタによってオブジェクトが生成されるのではありません。 new演算子によって、オブジェクトが生成されます。Javaによるオブジェクト指向プログラミングの基本中の基本です。
Tweet media one
2
21
33
1
3
3
@shims_ag
SHIMS
7 months
「継承」は英語で”inheritance”です。 “inheritance”(継承)は、プログラミング言語の「予約語」ではありません。 Javaでは「継承」の仕組みを実現するための「予約語」が2種類存在します。 “extends”と”implements”です。 “extends”は「拡張」、 ”implements”は「実装」 という意味です。
@Javakky_P
Javakky //流石にそろそろ働く
7 months
@shims_ag 他の言語が区別していないことは区別する意味がないことの論拠にはならないと思います。 なぜ区別する必要がないと思いますか?
0
2
2
1
0
2
@shims_ag
SHIMS
8 months
コーダーではなく、プログラマーを目指すなら、プログラミングを勉強しましょう。
1
1
3
@shims_ag
SHIMS
7 months
Webアプリケーションフレームは、あくまで、「Webアプリケーション」のためのフレームワークです。 例えば、家計簿アプリならば、百以上の金融機関にアクセスし、データを取得しなければなりません。
1
0
1
@shims_ag
SHIMS
7 months
毎日「クラス」を使って「型」の定義をしているはずなのに、 わざわざ「テスト駆動開発から型駆動開発へ」と表現するのは、今までその意義を理解していなかっただけでは?
@masuda220
増田 亨
7 months
テスト駆動開発から型駆動開発へ。 なんちゃってね。
0
0
1
0
0
4
@shims_ag
SHIMS
8 months
@sakamoto_582 クラスや構造体は、データ構造の定義です。そのデータ構造を実体化したメモリ上のデータに対し、アルゴリズムを適用するコードを設計することがプログラミングです。 フレームワークなどツールの使い方ばかり覚えると、プログラミング能力が身に付かなくなります。
0
0
4
@shims_ag
SHIMS
7 months
再利用し続けるのは、自分達が開発している製品のドメインロジックです。 サードパーティのミドルウェア、フレームワーク、ライブラリには、サポート期限があります。 成功しているプロダクトは超寿命です。
@MinoDriven
ミノ駆動
7 months
というか共通処理や再利用性、という観点から離れることが重要。フレームワークを開発しているなら再利用性を追いかける必要があるが、アプリケーションを開発しているならばドメインロジックはどれもほぼユニークであり共通と呼べるものはない。ユニークなロジックをDRYにする。
1
21
147
0
0
1
@shims_ag
SHIMS
8 months
プログラミング言語は自然言語とは全く異なります。 プログラミング言語は、コンピュータに対して特定の命令を行うために設計された言語です。 メモリにデータを記憶する命令、データを操作する命令があります。
0
0
4
@shims_ag
SHIMS
7 months
コンピュータ、ロボット、機械装置など、現代のハードウェアは、ソフトウェアがないと動きません。 プログラムは、ハードウェアに対する命令を文書化したものです。 このプログラムの良し悪しが、ハードウェアを上手く動作させることができるか、という品質の重要な要素にです。
1
0
1
@shims_ag
SHIMS
7 months
電気を扱う分野の人が、 他の人は電圧にこだわってるけど、考え方は人によって違うし、私は電圧なんて気にしない、 と述べたら頭がおかしいと思われても仕方ありません。
@shims_ag
SHIMS
7 months
「変数」はメモリ上に格納されているデータです。 「関数」もソースコードから機械語に変換されて、メモリに格納されています。 この「変数」と「関数」を関連付けたメモリ上の実体を「オブジェクト」、あるいは「インスタンス」と呼びます。
0
0
1
1
0
1
@shims_ag
SHIMS
7 months
Rustの「オブジェクト指向プログラミング」では、structとimplを使います。 —— struct オブジェクト名 { // 変数(フィールド) } impl オブジェクト名 { // 関数(メソッド) } —— Rustでは上記のように「変数」と「関数」を関連付けています。
Tweet media one
@shims_ag
SHIMS
7 months
目の前の「class」をよく見ると、下記のようになっているはずです。 class  変数  関数 プログラミング言語が違っても、上記のように1つに「カプセル化」して定義されているはずです。 このclassをテンプレートとしてメモリ上に生成したデータが「オブジェクト」です。
0
0
0
1
0
1
@shims_ag
SHIMS
8 months
変数は確保したメモリ領域の名前です。 変数に代入したデータは確保したメモリ領域に記憶されます。 データには、データの種類を表す「型」が必ず割り当てられています。 「型」には、数値型、文字列型などがあります。プリミティブ型と総称されます。
1
0
3
@shims_ag
SHIMS
7 months
ソフトウェア関連のポンコツな書籍の出版社を確認したら、なんと技術評論社ばかりですね。
0
0
2
@shims_ag
SHIMS
8 months
手続き型、関数型、オブジェクト指向型は、異なるプログラミング方法ですが、下記の(1)(2)の2つは共通です。 —— (1) データをメモリに記憶する命令をプログラミングする。 変数、配列、構造体、クラスなどを使って、メモリ上にデータを記憶させる命令を設計し、コーディングする。 (2)
@shims_ag
SHIMS
8 months
手続き型言語を使っていても、手続き型プログラミングが出来ていない人、 関数型言語を使っていても、関数型プログラミングが出来ていない人、 オブジェクト指向型言語を使っていても、オブジェクト指向プログラミングが出来ていない人 は相当数存在します。
0
0
3
0
0
1
@shims_ag
SHIMS
7 months
カプセル化は、オブジェクト指向のみならず、ソフトウェア設計の基本中の基本です。 Javaでは「クラス」を使うことで容易に「カプセル化」が設計できます。 「クラス」は「型」の定義でもあります。この「クラス」をテンプレートとして、メモリ上に「オブジェクト」を生成します。
@tako_no_tempura
海老の天麩羅
7 months
残念ですが、この説明はカプセル化では無いんじゃないかしら? それぞれを全く別の型としておけば、型チェックで弾いてくれるよね?っていう話だと私は思うわ。 これをカプセル化だと言うなら…あなた墓穴掘ったわね。
0
0
2
1
0
2
@shims_ag
SHIMS
8 months
仕事などフォーマルな文書では、中学や高校で教えられている文法は使われています。 中学や高校で教えられているが、実際には使われていない文法なんて存在しません。
0
0
3
@shims_ag
SHIMS
7 months
フレームワークやライブラリの使い方を習得することは重要です。 しかし、フレームワーク、ライブラリの使い方を習得したかどうかと、プログラミングを習得したどうかは別の話です。 DBのCRUD処理のコーディングが出来るというだけでは、プログラミングが出来るとまでは言えません。
0
0
2
@shims_ag
SHIMS
7 months
オブジェクト指向プログラミングでの「オブジェクト」は、「class」という「ユーザー定義型」の定義を基にして、メモリ上に生成した「インスタンス」です。 Rustでは「struct」、Haskellでは「data」を使って「ユーザー定義型」を定義し、その定義を基にしてメモリ上に「インスタンス」を生成します。
@shims_ag
SHIMS
7 months
下記の各言語のコードは、いずれの場合も「Money型のインスタンス」を生成しています。 「インスタンス」とはメモリ上の「データ」のことです。 Python, Java, C#, Rust, Haskellと言語は違っていますが、左辺の「変数money」がメモリ上の「インスタンス」を指していることは共通しています。
1
1
1
0
0
3
@shims_ag
SHIMS
7 months
(a)(b)(c)の処理は、コンパイラ、インタプリタ、仮想マシンが実行します。 これらをまとめて「言語処理系」、単に「処理系」ともいいます。 Javaの場合は、JVMという仮想マシンが(a)(b)(c)の処理を実行します。 javacはコンパイラなので「言語処理系」に含まれます。
@shims_ag
SHIMS
7 months
メモリ領域の確保の話になると、話をそらされたと考えるのは、コンピュータの動作原理の理解が欠落しているからでしょう。 コンピュータは命令しないと動きません。命令は以下の2つです。 —— (1)メモリにデータを記憶する命令。 (2)上記(1)で記憶したデータを操作、処理する命令。 ——
1
0
1
0
1
3
@shims_ag
SHIMS
8 months
ソースコードから設計書を生成することは一般的な作業です。Java APIのドキュメントが典型例です。 ソースコードから生成したドキュメントには、モジュール、クラス、メソッド、メソッドの引数、メソッドの戻��値が明記されます。
@masuda220
増田 亨
8 months
設計書とソースコードの不一致はよく見かける。別々に書いているので、本質的に一致しない。 設計とソースコードは必ず一致する。ソースコードで固定されたものが設計。つまりソースコードが本来の設計書。 ソースコードに明示されない設計事項もあるが、なんらかの形でソースコードに暗示される。
1
3
43
0
0
1
@shims_ag
SHIMS
7 months
「変数money」に「ユーザー定義型」を指定せずに、 整数型などのプリミティブ型をそのまま使うと、 あっという間にスパゲッティコードになって行きます。
@shims_ag
SHIMS
7 months
貿易、金融、会計、ECサイトで不可欠な「通貨データを生成する」という機能要件では、値としてマイナスを許容しない条件が付きます。 「ユーザー定義型」を設計していたら、値のチェックを行う処理は、「Money型」のソースコードに定義することが論理的に決定出来ます。
1
0
0
0
0
2