Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【実用性皆無!】学習のために無意味にClassを作ってみるテスト その7【誰得?】「バーチャルブロガーやっと記事を書く。の巻(後編)」

 どうも!LSSです!

 

 AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。

 

 無意味にClassを作ってみる、バーチャルブログシリーズ「その7」です!

 

 

 さて、前回は「バーチャルブロガーがやっと記事を書きます!w」と言いながら結局書く前に終わってしまいましたね^^;;;

 

 今回こそ、確認画面のほうもちょっと手直しが必要な状態ですが、さくっと行きます!

 

 

MainActivity.ktの編集

 えっと、各ブロガーが挨拶したり、読者登録したり、toString()で確認表示したりしていたら、

f:id:little_strange:20200118230238p:plain

↑こんな風に画面がいっぱいいっぱいになった状態でした。

 

 ストーリー的に続けたいので、どうしようかなーと考えた結果、

「画面タップで次の展開の文が出る」ようにする事にしました^^

 

 

package jp.littlestrangesoftware.a20200111_class_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

var story_text= mutableListOf<String>()
var story_i = 0

var blogtarou = Blogger("ブログ太郎",1234)
var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

story_text.add ( blogtarou.hello() +"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+

blogtarou.touroku(sslkun)+"\n"+
sslkun.touroku(urokogumo)+"\n"+
urokogumo.touroku(pokeko)+"\n"+
pokeko.touroku(blogtarou)+"\n"+

"\n"+blogtarou.toString()+"\n"+
"\n"+sslkun.toString()+"\n" +
"\n"+urokogumo.toString()+"\n" +
"\n"+pokeko.toString()+"\n"
)

tv0.text=story_text[0]

pokeko.blog_genre="ゲーム"
pokeko.blog_title="マイクラ三昧!"

pokeko.post("ついに海底神殿発見!","スポンジいっぱい取れるかなぁ。\n次回、いよいよ攻め込みます!")
pokeko.post("エルダーガーディアン2体撃破!あと1体は…","2体目まではあっさり狩った。\nが、3体目が見つからない~!")

story_text.add("うろこ雲の「お知らせ」を表示。\n" +
"${urokogumo.notice_text}\n"
)

}

fun tv0clk(v: View){
story_i++
if (story_i > story_text.lastIndex){
story_i=0
}
tv0.text=story_text[story_i]
}
}

 

↑ストーリー進行に関わる部分を赤文字にしてみました。

 

 まず、画面出力用の文字列をstory_textというString型を要素とする配列変数に格納するようにしました。

 

で、story_text.addで文字列を引数として渡すと、

一番最初にaddした文字列が、story_text[0]

次にaddした文字列が、story_text[1]

に入るという事になります。

 

 実際、LSSはここでつまづいたんですが、いきなり、

story_text[0]="画面出力用の文字列"

とすると、コンパイルは通るけどスマホ実機側でアプリが最初からエラーで起動しないという厄介な問題になりました^^;;;;。Class以前の問題ですね^^;。

 

 最初は空配列なので[0]でも0番目の要素が存在せず、まずaddで作らないとダメ!という事かと理解しました。

 

 

 

ポケコ、ブログのジャンルとタイトルを設定する

 

 引き続き、↑に書いたMainActivity.kt内の記載についての話になります。


pokeko
.blog_genre="ゲーム"
pokeko.blog_title="マイクラ三昧!"

 

 ブログジャンルとブログタイトルを最初に設定したのは、ポケコでした!

 ゲームブログで、タイトルは「イクラ三昧!」というそうです。 

 

 

 方向性が決まり、ノってきたのか、

 

pokeko.post("ついに海底神殿発見!","スポンジいっぱい取れるかなぁ。\n次回、いよいよ攻め込みます!")
pokeko.post("エルダーガーディアン2体撃破!あと1体は…","2体目まではあっさり狩った。\nが、3体目が見つからない~!")
 

 

連続で記事投稿されていますねw

 

 

ついに海底神殿発見!

スポンジいっぱい取れるかなぁ。

次回、いよいよ攻め込みます!

 

エルダーガーディアン2体撃破!あと1体は…

2体目まではあっさり狩った。

が、3体目が見つからない~!

 

 という2記事を投稿されたようです^^

 

 

読者である、うろこ雲の「お知らせ」の内容を確認

 前回、Bloggerクラスにpostメソッド(記事投稿)を追加した時に、

「読者全員の『お知らせ』にブログ名と記事タイトルを追記するようにしました。

 

なので、ポケコさんを読者登録した、うろこ雲さんの「お知らせ」の内容を覗かせてもらって、ちゃんと通知されてるか確認してみましょう。

というのが、

story_text.add("うろこ雲の「お知らせ」を表示。\n" +
"${urokogumo.notice_text}\n"
)

↑この部分になります。

 

 

画面タップで次の展開の文章に切り替える、には

fun tv0clk(v: View){
story_i++
if (story_i > story_text.lastIndex){
story_i=0
}

tv0.text=story_text[story_i]
}

↑こんなコードを書きました。

 

 文章を表示しているTextView「tv0」の「onClick」に、この「tv0clk」という関数をxml側で割り当てています。

 

で、「今、画面に表示されているのはどのシーン(story_textのいくつめの要素)か」を管理するInt型(整数型)の変数「story_i」を

story_i++

で、まず+1しています。

 

 次の if
「シーンが最後まで進んだら(story_iがstory_textの要素数を超えたら)、話を最初に戻す(story_iを0にする)

という処理を行っています。

 

 そして、

tv0.text=story_text[story_i]

で実際に該当する文章でtv0(と名付けたTextView)を書き換える、という処理の流れですね。

 

 

いよいよ実行!

 アプリが起動して最初に出るのは、いつもの

f:id:little_strange:20200122214124p:plain

 

この画面。で、ここで画面をタッチすると…

 

f:id:little_strange:20200122214207p:plain

 

 ポケコが2回連続投稿した記事の「ブログタイトル」「記事タイトル」が、読者であるうろこ雲「お知らせ」に届いていますね!^^

はてなブログの「お知らせ」は1ブログ毎に最新記事しか同時に載りませんがw

 

 

 

 

 2回に渡り、新たなクラスの作成と、それのBloggerクラスのプロパティへの組み込みそれを操作するメソッドなんかを作ってみました。

 ついでに、配列のおさらいもやったような感じですねw

 

 バーチャルブログ内では、ポケコがはりきって2記事書きましたが、その内容を確認するメソッドや、記事投稿日時の確認部分はまた、別の話って事で。

 

 

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくお願いします^^

 

 

 

 

【実用性皆無!】学習のために無意味にClassを作ってみるテスト その6【誰得?】「バーチャルブロガーやっと記事を書く。の巻(前編)」

 どうも!LSSです!

 

 AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。

 

 無意味にClassを作ってみる、バーチャルブログシリーズ「その6」です!

 

 前回は、「読者登録」機能を模したものを作り、バーチャルブロガーたちが全員、他の人の読者になりました。

で、今回なんですが、ホント今更感はありますが
バーチャルブロガーがやっと記事を書きます!w

  

 

記事を書く、とはいっても

 そもそも「記事」という概念を用意していないので、用意する必要がありますねw

で、それを言ったら「ブログタイトル」「ブログジャンル」ぐらいも用意したいところです。

 

という事で、色々作っていきますね!

 

 

新たなクラス「記事」を作ろう!

 一口に「記事」といっても最低限、
「書いた日時」「題名」「本文」ぐらいは欲しいところ。

 

 こうした複数の要素を「記事」という一括りにまとめるために、「記事」の概念をクラスとして作成します!

 

 

f:id:little_strange:20200121214414p:plain

 はい。AndroidStudio、Projectウィンドウの中の、

Java内のプロジェクト名を右クリック、

右に出てきた、Newにマウスカーソルを合わせ、

更に右に出てきた、Kotlin File/Classをクリックします。

 

 

f:id:little_strange:20200121215016p:plain

 小さいダイアログが出てくるので、Nameの欄にはこれから作りたいクラス名を入力します。

 ここではKijiとしました。(任意の名前。好きに名づけてOK!)

 

で、Kindは右の▼をクリックして、出てきた候補の中からClassを選択してOKボタンを押します。

 

 

f:id:little_strange:20200121215254p:plain

Kijiクラスの下地ができました^^

 

 

記事クラスの内容を用意します

class Kiji (title:String="無題",body:String="")

 とりあえず↑のように書きました。

 

 一応、これだけでも
「タイトルと本文をString型で渡せば記事のインスタンスが作れて、タイトルは省略すれば『無題』、本文は空欄になる」
というクラスとして使えます!

 

で、ここに「書いた日時」を管理するプロパティを追加します。

 

 書いた日時については、指定するものではなく、実際に記事インスタンスを作成した日時を入れたいので、コンストラクタ(↑の(title:String="無題",body:String="")の部分)には入れずに、

 

import java.util.*

class Kiji (var title:String="無題",var body:String=""){
val upload_time: Date = Date()
}

 

{ }の中でvalで宣言しました。

valで宣言すると、後からの変更はできなくなります。
 後から変更可能にしたい時はvarを使います。

 

 とりあえず、記事クラスについてはここで置いておきますね。

 

 

Blogger.ktの編集~!

 さて、「記事」は各ブロガーが固有で複数持つものなので、Bloggerクラスに、

  • ブログジャンル
  • ブログタイトル
  • 記事、を中身とする配列

の3つのプロパティの追加、そして

  • 記事を書く

というメソッドを追加していきます!

 

package jp.littlestrangesoftware.a20200111_class_test

class Blogger ( var name:String="ななしのごんべ" , var pv:Int=0){

var follow= mutableListOf<Blogger>()
var follower= mutableListOf<Blogger>()
var notice_text=""

var blog_genre = ""
var blog_title = ""
var kiji_list = mutableListOf<Kiji>()


fun hello(): String {
pv++
return "こんにちは!${name}です。よろしく!"
}

fun post(str0:String,str1:String) {
kiji_list.add( Kiji( str0 , str1 ) )

follower.forEach{
it.notice_text += "$blog_title$str0\n"
pv++

}
}


fun touroku(aite:Blogger):String{
follow.add(aite)
aite.follower.add(this)
return "${name}${aite.name}の読者になりました!"
}

override fun toString(): String {
var s0=""

s0 = "ブロガー名:$name\n"
s0 += "累計PV:$pv\n"

s0 += "購読中:"
follow.forEach{
s0 += it.name + " "
}
s0 += "\n"

s0 += "読者:"
follower.forEach{
s0 += it.name + " "
}
s0 += "\n"

return s0
}

}

 

↑こんな感じに、がしがしと書きました。

 また、赤文字部分が今回追記した部分となります。

 

 

var blog_genre = ""
var blog_title = ""
var kiji_list = mutableListOf<Kiji>()

 

 上から順に、ブログジャンル、ブログタイトル、そして記事の配列を宣言しています。

 

 

fun post(str0:String,str1:String) {
kiji_list.add( Kiji( str0 , str1 ) )

follower.forEach{
it.notice_text += "$blog_title$str0\n"
pv++

}
}

 postという名前で記事投稿メソッドを用意しました。

 

 記事タイトル、記事本文を引数として渡すと、 

Kiji( str0 , str1 )

にて、記事インスタンスを作成、それと同時に

kiji_list.add

で、その記事をそのブロガーの記事リストの1つとして追加してくれる、という内容となっています。

 

follower.forEach{
it.notice_text += "$blog_title$str0\n"
pv++

}

続けて、記事を投稿したブロガーのfollower(読者)さん達のnotice_text(お知らせ)に、ブログ名と記事タイトルを追記しています。

 

…ついでに、読者さんの数だけループする処理の中にpv++を書いているので、
「読者さんの数だけPVが増える!」というオマケつき^^

 

 

 

ここで一旦、区切ります^^;

 ここから、MainActivity.ktの編集に入り、2つのクラスの動作を確認する段階に入るところですが、だいぶ長~くなってしまいそうなので、今回の記事はいったんここまで!とさせていただきます^^;

 

「後編」で確認部分を書きます!

…間違っても「中編」として3部構成にならないようにしなくちゃwww

 

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくお願いします^^

 

 

 

 

 

リクエスト記事:詩 お題「夏」

 どうも!LSSです!!

 

 昨日はさすがに親子丼2人前 一気食い☆して、夕食も今日もなかなか食欲が戻りませんでした^^;;;

 

 で、その上記記事のコメントで、なお吉さん(id:life-memo123)から、 

そこでLSSさん、 お題が「夏」文字数は10行だったらLSSさんならどんな詩を書きますか? 時間があればとても読んでみたいです

【料理は】大雑把に、しかし工夫もくわえつつ親子丼を作った!【科学実験】 - Little Strange Software

と言っていただいたので、今回はにチャレンジしてみたいと思います!! 

 

 

 

「夏」 

今は冬。場所はいつもの閑散とした公園。

 

数か月前、今の静寂から考えられないほどの熱気と喧騒に包まれたこの公園で、

生命を燃やし尽くした「あいつ」の事を思い出す。

 

何年にもわたる下積み生活を経て、這い上がってきたあいつは、やがて栄光の翼を手に入れた。

 

上に上がるほど枝分かれし、複雑化する世界を颯爽と駆け上がり、命の限り愛を歌い続けた。

その歌に魅了された数多(あまた)の女たちに寵愛を与え、そしてまた愛を歌い続ける。

 

命を燃やし尽くしたあいつも、寵愛を得て子を残した女たちもみんな、短すぎた夏が終わる頃には

路上にその骸(むくろ)を晒す。全力を尽くして生命を駆けぬいた、悔いなき骸を。

 

今は冬。場所はいつもの閑散とした公園。数か月後にはまた、あの喧騒の夏がやってくる。

そして俺は、きっとまたこう言うのだ。「蝉うるせぇ!!」…と。

 

 

 

 

 

 …これ、「詩」といっていいのかなぁw

 

  なお吉さん、LSSが書くとだいたいこんな感じですw

 

 

 

【料理は】大雑把に、しかし工夫もくわえつつ親子丼を作った!【科学実験】

 どうも!LSSです!

 

 今日は久々に親子丼を作ってみました^^

 

 かなーり前に作ってみた事はありました。

 その後、一度また作ってみようと試みて、

親子丼作ろう
→鶏肉買いにいくの面倒だな。玉ねぎぐらい家にあるだろう。玉子丼でいいや
→ありゃ!玉ねぎがない具のない玉子丼になるか。まぁそれでいいや。
ごはんも無かった!!
具のない玉子スープの完成

ってなっちゃった事があり(それはそれで話のネタにしてますがw)、それからまた月日が経っての挑戦です!!

 

 一応、先にネットで2,3親子丼レシピを見ましたが、作り方にはばらつきがあって、やはり結構テキトーに作れる料理なんだな、って思いましたw

 分量と、鶏肉と玉ねぎにどの程度の加熱が必要かを参考にしました。

続きを読む

【実用性皆無!】学習のために無意味にClassを作ってみるテスト その5【誰得?】「ブログ太郎、自分を見つめ直す。の巻」

 どうも!LSSです!

 

 AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。

 

 無意味にClassを作ってみる、バーチャルブログシリーズ「その5」です!

 

その1では、Classを作ってみたら案外簡単に出来た話、

その2では、Classからインスタンスを作る時に引数を省略できる方法の話、

その3では、それまでプロパティしかなかったBloggerクラスにメソッドを作ってみた話。

その4では、読者リストプロパティ等を追加し、読者登録機能を実装した話でした。

 

 今回は、前回追加した読者リストの内容を確認できるものを作ります。

 

 また、その機能を実装する方法として、
もともとあるメソッドであるtoString()を上書き(override) してその機能を割り当てる
という事をやってみます!

 

 

再確認:toString()とは

 これまでも何気なく使用していますが、様々な変数の名前の後ろに.toString()とつけてやると、その変数の中身をString型(文字列型)に変換してくれる、というメソッドです。

 

 例をあげると、

a=8823

textview.text=a

とすると、左辺のtextview.textはString型なので、そこにInt型(整数型)を入れようとしているのでエラーになりますが、

a=8823

textview.text=a.toString()

とすると、aの内容8823が文字列"8823"となり、textviewに8823と出てきてくれる、そんな便利なメソッドです^^

 

 現在、作成しているBloggerクラスは、特にtoString()を用意していませんが、それでもtoString()メソッドは使えちゃいます!

 

なぜ使えちゃうのか、ちょっと小難しい話になりますが…
新規のClassとして作成したBloggerクラスですが、Kotlin内では全てのClassが「Any」というクラスを宣言せずとも継承している事になっているらしく、そのAnyクラスがtoString()メソッドを備えているため、使用できる、という事らしいです。

 

 

試しにブログ太郎をtoString()で文字列化してみます

 複数のプロパティやメソッドを持つBlogger型のインスタンスであるブログ太郎。

 これをtoString()で文字列化したらどうなるのか?

 

tv0.text = "ブロガー名:" + blogtarou.name + "\n" +
"PV累計:" + blogtarou.pv.toString() + "\n" +
blogtarou.hello() +"\n"+
"PV累計:" + blogtarou.pv.toString()+"\n"+
"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+
blogtarou.touroku(sslkun)+"\n"+blogtarou.toString()

 

↑こんな風に赤文字部分を最後に追加しました。

で、実機で実行すると…

 

f:id:little_strange:20200118215737p:plain

 

↑こんなんでました!

jp.~からの部分が該当する部分ですね。

 なんだかプロジェクト名から始まり、クラス名であるBloggerって文字が入ってるのは分かりますが、あとは意味不明の文字列。

 

 便利なはずのtoString()メソッドが、意味不明の文字列を吐くメソッドに成り下がっていますw

 

 

ここから本題。toStringを再利用!

 Blogger.ktに、toStringを上書きするコードを書いていきます!

 

package jp.littlestrangesoftware.a20200111_class_test

class Blogger ( var name:String="ななしのごんべ" , var pv:Int=0){

var follow= mutableListOf<Blogger>()
var follower= mutableListOf<Blogger>()
var notice_text=""

fun hello(): String {
pv++
return "こんにちは!${name}です。よろしく!"
}

fun touroku(aite:Blogger):String{
follow.add(aite)
aite.follower.add(this)
return "${name}${aite.name}の読者になりました!"
}

override fun toString(): String {
var s0=""

s0 = "ブロガー名:$name\n"
s0 += "累計PV:$pv\n"

s0 += "購読中:"
follow.forEach{
s0 += it.name + " "
}
s0 += "\n"

s0 += "読者:"
follower.forEach{
s0 += it.name + " "
}
s0 += "\n"

return s0

}


}

 

 上書き=override、で

override fun toString(): String {

と書き始めています。

 

 overrideで宣言する事で、
「継承元の意味不明な文字列を出す事をやめて、これから書く内容を実行してね!」
っていう宣言ですね。

 

で、取り出す文字列を作るのに、

var s0=""

s0というString型の変数を一時的に使用します。

 

s0 = "ブロガー名:$name\n"
s0 += "累計PV:$pv\n"

 名前やPVを取り出して、¥nで改行を入れながらまず出力。
※なんか\になってますが、¥の半角です^^;

 

follow.forEach{
s0 += it.name + " "
}

 それから、 forEachfollowリストの中のnameを全て、取り出しています。
 これが、そのブロガーが読者登録したブロガー名一覧=購読中一覧です^^

 

follower.forEach{
s0 += it.name + " "
}
 同じく、followernameを全て取り出しています。
 こっちは、そのブロガーを読者登録したブロガーの一覧=読者一覧になります。

 

で、

 return s0

これで、組み立てた文字列を返す事になるはず…。

 

 

確認用のほうも手を加えます!

MainActivity.ktの、tv0を書きだす部分も変更していきます!

package jp.littlestrangesoftware.a20200111_class_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

var blogtarou = Blogger("ブログ太郎",1234)

var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

tv0.text = blogtarou.hello() +"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+

blogtarou.touroku(sslkun)+"\n"+
sslkun.touroku(urokogumo)+"\n"+
urokogumo.touroku(pokeko)+"\n"+
pokeko.touroku(blogtarou)+"\n"+

"\n"+blogtarou.toString()+"\n"+
"\n"+sslkun.toString()+"\n" +
"\n"+urokogumo.toString()+"\n" +
"\n"+pokeko.toString()+"\n"
}
}

 

 これまでは、最初にブログ太郎の名前とPVを確認していましたが、最後にtoStringで出力するので省きました!

 

 まず最初に全員がhello()メソッドで挨拶します。

 

 次に、ブログ太郎がSSL君を、SSL君がうろこ雲を、うろこ雲がポケコを、ポケコがブログ太郎を、それぞれ読者登録します。

 

 最後に全員、「状態を確認するメソッド」として生まれ変わったtoString()で、名前・PV・購読ブロガー一覧・読者一覧を確認する、という流れ。

 

 これでまんべんなく、変更点が確認できるはずー!

 

 

さて、実行しますか

f:id:little_strange:20200118230238p:plain

 

 

…だいぶ、画面がカツカツになってきてはいますが、無事に動作しました!!

 

  既存の、それも本来はめっちゃ便利なtoString()メソッドを上書きしてしまう、というのにちょっと恐れもありましたがw、これはBloggerクラスに限っての話なのでセフセフwww

 ※ちなみに、「みんな最初は0」だったハズのPVが1になっているのは、helloメソッドで+1されてるからです^^

 

 

しっかし、それにしても…

  4人いてみんな読者登録してるのに、誰も相互登録していないって、想像すると異常な状況ですよねwwwww

 

 

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくお願いします^^ 

 

 

 

 

【実用性皆無!】学習のために無意味にClassを作ってみるテスト その4【誰得?】「ブログ太郎と愉快な仲間たち。の巻」

 どうも!LSSです!!

 

 AndroidStudio+Kotlinでスマホアプリ開発の勉強中です。

 

 途中2回の公募企画を挟んでの「その4」です。

 

その1では、Classを作ってみたら案外簡単に出来た話、

その2では、Classからインスタンスを作る時に引数を省略できる方法の話、

その3では、それまでプロパティしかなかったBloggerクラスにメソッドを作ってみた話でした。

 

公募企画結果発表で、新たに3人のバーチャルブロガー仲間を加えて、今回からは
「読者登録(バーチャルブロガーが他のバーチャルブロガーをフォローする)」
機能を追加したいと思います!

 

 

読者登録機能を作るに先立って必要なモノは?

 リアルの「はてなブログ」のブロガーの皆さんお馴染みの「読者登録」機能。

 

  • 登録すると、自分(ブロガー)の登録したブログ一覧に他ブロガーが追加登録される
  • 登録された側の、読者一覧に自分(登録したブロガー)が追加登録される
  • 登録したブログの更新通知を受け取って『お知らせ』に通知が書きだされる

 

 大きくまとめると、これだけの動作が必要です。

 これを模した機能を追加するなら、機能自体を作るその前に!

 ちょっと各ブロガーにプロパティ(データの入れ物)を追加しないといけません。

 

  • 自分が登録したブログのリスト
  • 自分を登録してるブロガーのリスト
  • 自分の『お知らせ』欄

↑最低限、この3つは必要ですね。

 

 

Blogger.ktをいじってみる!

 いきなり、書いてみます!
 例によって赤文字部分が今回追記した内容です^^

 

package jp.littlestrangesoftware.a20200111_class_test

class Blogger ( var name:String="ななしのごんべ" , var pv:Int=0){

var follow= mutableListOf<Blogger>()
var follower= mutableListOf<Blogger>()
var notice_text=""

fun hello(): String {
pv++
return "こんにちは!${name}です。よろしく!"
}
}

 

followという任意の名前のプロパティ、これが「自分が登録したブロガー」のリストのつもりです。

followerという任意の名前のプロパティ、これが「自分を登録してくれたブロガー」のリスト。

 

notice_textという任意の名前のプロパティ、これが「お知らせ」を受け取るString型のプロパティ。

 

…あまり深く考えずにガシガシ書いちゃいました。これで大丈夫なんかな^^;

 

mutableListOf で、内容変更可能な配列変数を定義しています。
その内容としては<Blogger>と、ダイレクトにBlogger型のオブジェクトを入れられるようにしちゃっています。

 

Blogger型の定義の中にBlogger型のプロパティ…再帰呼び出しみたいになってて、色々と不安になってきましたw

再帰呼び出し…関数とかで、関数内でその関数自身を呼び出す事。
例えばPCのフォルダの中にサブフォルダがあって、その中にまたサブフォルダ…と何階層あるか分からないようなデータをあるだけ精査したい時なんかに使います。
が、一歩間違うと無限ループにならないか?って不安がつきまといますw 

 

 

不安になったので、動作は何も変わってないけど実行!

f:id:little_strange:20200117225138p:plain

 

 うん、前回のままだけどちゃんと動作しました^^

 

 

tourokuメソッドを追加してみますね。

 ブログ書きながら、コード書いて実行して、の実況状態。
 不安しかないですwww
 一応、脳内では色々考えてから始めてますが、はたして…

 

package jp.littlestrangesoftware.a20200111_class_test

class Blogger ( var name:String="ななしのごんべ" , var pv:Int=0){

var follow= mutableListOf<Blogger>()
var follower= mutableListOf<Blogger>()
var notice_text=""

fun hello(): String {
pv++
return "こんにちは!${name}です。よろしく!"
}

fun touroku(aite:Blogger):String{
follow.add(aite)
aite.follower.add(this)
return "${name}${aite.name}の読者になりました!"
}


}

 また、赤文字部分が追記した部分になります。

 メソッド名はtouroku、登録する相手Bloggerインスタンスを一時的に入れておく、引数の受け取り変数をaiteとしました。
(ここまで英語でやってきてのローマ字^^;;;)

 

follow.add(aite)

で、followと名付けた配列変数にaddで対象となるブロガーをBlogger型のままリスト追加します。

 

 これは例えば、
blogtarou.touroku(sslkun)
と書いて実行すれば、ブログ太郎の登録ブログ一覧にSSL君が追加される、言い換えるとブログ太郎がSSL君の読者になる、という動作を期待しています。

 

aite.follower.add(this)

で、SSL君のfollowerと名付けた配列変数にaddで、tourokuを実行したほうのブロガー(blogtarou)が追加され、「SSL君を登録した読者の一覧」にブログ太郎が追加される事になります。

 

fun touroku(aite:Blogger):String{

ここに:Stringと書いているので、このメソッド自体がString型(文字列型)として値を返す事になり、

 

return "${name}${aite.name}の読者になりました!"

で登録が行われた事が分かる文字列を吐き出すようにしました^^

 こうしておくと、tourokuメソッドを呼び出す時に、

tv0.text = blogtarou.touroku(sslkun)

という書き方をしておくと、tv0(とidをつけたテキストビュー)に
「ブログ太郎が SSL君の読者になりました!」
と表示される事を期待しています。

 

 

メソッドの実行確認のために、MainActivity.ktの編集

 

package jp.littlestrangesoftware.a20200111_class_test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

var blogtarou = Blogger("ブログ太郎",1234)

var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

tv0.text = "ブロガー名:" + blogtarou.name + "\n" +
"PV累計:" + blogtarou.pv.toString() + "\n" +
blogtarou.hello() +"\n"+
"PV累計:" + blogtarou.pv.toString()+"\n"+
"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"+
blogtarou.touroku(sslkun)+"\n"

}
}

 

 前回までのtv0.textの代入にそのまま続けてみました!

 ここまで、不安を感じつつもガシガシと書いてきたので、すんなりいけるかどうか…。

 

 

どきどきの実行!

 いざ、実機で動作確認します!

 

 

 

 

 

f:id:little_strange:20200117232006p:plain

 

 

 

大・成・功!!

 

 

 なんかすんなり行きすぎて山場のない記事になりましたwww

 

…とはいえ、「返す文字列を確認した」だけなので、ホントは配列変数の内容を確認するモノも作らないとなんですが…まぁいけてるんじゃないかな^^(急に楽観的w)

 

 

と、なんとなく自信がついてきたところで、今回はここまで!

 次回もまた、よろしくお願いします^^

 

 

 

Class作成シリーズ、バーチャルブロガー名のご応募、誠にありがとうございました!

 どうも!LSSです!!

 

 昨日、

にて、

「バーチャルブロガーの名前を募集」
させていただきました!

 

…いや、割と本気で「0件だったらどうしよう」と思っていましたがw

 

 

SSL

 コメント欄にて、ギャクバリさん (id:minimalist_gyakubari)からいただきました!

 どこかのブロガーに名前似てる気がしなくもないですね!w

  一番乗りのご応募、ありがとうございました^^

 

うろこ雲

 はてブコメントにて、海さん(id:nanimositeinai)からいただきました!

 LSSが自分では絶対思いつかないような詩的な名前ですね。

 ご応募、ありがとうございました^^

 

ポケコ

 はてブコメントにて、いのっちさん(id:rapisino)からいただきました!

 いのっちさんには、そもそもBloggerクラスを作る時にもアイデアをいただいており、重ね重ねありがとうございます!

 ご自身でマイクラで使っておられる名前との事…いいんですか?本当に?

 遠慮なくいただきます!ありがとうございます^^

 

いただいたバーチャルブロガー名、どれを使うか

は、全部使わせていただきます!

 良かった、何十件と来てたらどうしようかと思ったw(最初と言ってる事ちげー!)

 

 ブログ太郎、もう寂しくないね^^

 

 

と、いう事で…Kotlinで早速、書いていきます!

 

class MainActivity : AppCompatActivity() {

var blogtarou = Blogger("ブログ太郎",1234)

var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

tv0.text = "ブロガー名:" + blogtarou.name + "\n" +
"PV累計:" + blogtarou.pv.toString() + "\n" +
blogtarou.hello() +"\n"+
"PV累計:" + blogtarou.pv.toString()+"\n"+
"\n"+
sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"

}
}

 

 赤文字部分が、たった今追記した部分です。

 

Bloggerインスタンスの作成(=バーチャルブロガー誕生!)

var sslkun = Blogger("SSL君")
var urokogumo = Blogger("うろこ雲")
var pokeko = Blogger("ポケコ")

 

 入れておく変数はそのままローマ字で名付けました(変数名は任意でOK)。

 pvは後で考えるとして省略(Class側の定義によりその場合0が適用されるようにしています)。

 

 こんな風にvarで宣言するだけで作っておいたクラスのインスタンスが生成できるんですね^^

 

 バーチャルブロガーが一気に3人増えました!

 

 

誕生した事を確認!のために全員でhello()メソッド!!

が、

sslkun.hello()+"\n"+
urokogumo.hello()+"\n"+
pokeko.hello()+"\n"

↑この部分ですね。

 

helloメソッド(自作メソッド)については↓の記事に書きました。

 

Blogger型に持たせたメソッド(関数)なので、ブログ太郎だけでなく、同じくBlogger型の3人もhelloメソッドを使えます^^

 

 

いざ実行!

f:id:little_strange:20200116215917p:plain

 新たな3名のバーチャルブロガーがバーチャルブログデビューし、元気に挨拶しています^^

 

 ご協力いただいた皆様、本当にありがとうございましたm(_ _)m

勝手にidコールしてますが、もしマズかったら言ってくださいね

 

てなとこで、今回はこのへんで!

 次回もまた、よろしくです^^