Little Strange Software

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

【実用性皆無!】学習のために無意味に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)

 

 

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

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