Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Week10 #26

Merged
merged 5 commits into from
Jun 15, 2019
Merged

Week10 #26

merged 5 commits into from
Jun 15, 2019

Conversation

ChihYang41
Copy link
Collaborator

這次把 week8 作業試著寫成 OOP,麻煩 Huli 大力鞭,指出哪裡需要改進了,謝謝~

關於 Week8 作業寫成 OOP:

其實也還沒很懂 OOP 設計模式,看到有人說「需求一定會變,程式碼一定會改。」,然後物件導向影片說從怎麼用開始構思如何寫一個 class,所以這次就從「如何方便的使用」以及「不容易一牽髮動全身」的角度來寫 class。

本來大概想遵從幾個原則是:

  1. class 不要像瑞士刀裝一堆 method,分類清楚
  2. 方便改動或是使用
    不過寫完發現重複使用性不高,也不方便使用,可讀性好像跟之前差不多 XDD

hw1

code 變長了,不過我覺得好像有比較可讀和好使用嗎?如果日後要增加獎項就在 constructor 塞參數進去,再用 method showPrizeResult()就可以重複使用了。

hw2、hw3

本來是想說「把 request 包在 class 裡面變成 method,想要 post 或 get 的時候就可以輕鬆使用了。」,但是全部寫完才想到 fetch 完 return 的是 Promise ,而 Promise 裡 [[promisevalue]] 的值也沒辦法取出來,所以泛用性好像也沒很好嗚嗚

總之覺得寫起來好像沒有優化的樣子哈哈哈哈,麻煩不吝指教

關於 Week10 心得

大致上是寫一些心路歷程,廢話佔了大半,摻雜一些覺得課程哪些地方可以改進的意見,Huli 覺得哪裡說的不對或是對於我學習的方式有什麼建議也可以說!感謝哈哈

@aszx87410
Copy link
Member

OOP 的部分你現在感覺只是把 function 換成物件導向裡的 method 而已,仔細看你就會發現差異不大,twtich 那題我改一下給你看,讓你參考一下什麼叫做方便重複使用:

class TwitchAPI {
  constructor(clientId) {
    this.baseUrl = 'https://api.twitch.tv/kraken'
    this.clientId = clientId;
  }

  sendRequest(url) {
    const headers = new Headers({ 'Client-Id': this.clientId });
    const myInit = { headers };
    return fetch(this.baseUrl + url, myInit).then((res) => {
      if (res.ok) {
        return res.json();
      }
      return null;
    });
  }

  getPopularGames() {
    const url = '/games/top?limit=5';
    return this.sendRequest(url);
  }

  getLiveStreams(gameName, offset) {
    const url = `/streams/?game=${gameName}&limit=20&offset=${offset}`;
    return this.sendRequest(url);
  }
}

const twitchApi = new TwitchAPI('z97jvca5asox81v22jbb24eziykct5');

// 用的時候
const response = await twitchApi.getPopularGames();
const response2 = await twitchApi.getLiveStreams('LOL', 10);

@aszx87410
Copy link
Member

抽獎那題 Prize 應該只當作一個容器(?)拿來放資料比較好,顯示的部分可以切開,而且可以盡量避免全域變數,改完大概會長這樣(沒有完全改好,意思有到就好):

const btn = document.querySelector('.btn');

const firstPrize = new Prize('恭喜你中頭獎了!日本東京來回雙人遊!', 'http://pixelartmaker.com/art/cec844662085081.png', 'first__prize__background')
const secondPrize = new Prize(...);
const thirdPrize = new Prize(...)

function showPrizeResult(prize) {
  const body = document.querySelector('body');
  const lotteryTitle = document.querySelector('.title');
  const lotteryImage = document.querySelector('.lottery__image');

  lotteryTitle.innerText = prize.title;
  lotteryImage.src = prize.imgUrl;
  body.classList.add(prize.bgColorClass);
}

class Prize {
  constructor(title, imgUrl, bgClass) {
    this.title = title;
    this.imgUrl = imgUrl;
    this.bgColorClass = bgClass;
  }
}

// 初始化背景顏色
function initializeBackground() {
  body.classList.add('bg_initialize');
  body.className = '';
}

// 渲染抽獎結果到畫面上
function showLotteryResult(prize) {
  lotteryImage.classList.remove('hidden');
  initializeBackground();
  switch (prize) {
    case 'FIRST':
      showPrize(firstPrize);
      break;
    case 'SECOND':
      showPrize(secondPrize);
      break;
    case 'THIRD':
     showPrize(thirdPrize);
      break;
    case 'NONE':
      showPrize(none);
      break;
    default:
      // statements_def
      break;
  }
  btn.innerText = '再來一次!';
}

// 抽獎的非同步 function
async function lottery() {
  try {
    const response = await fetch('https://dvwhnbka7d.execute-api.us-east-1.amazonaws.com/default/lottery').then((res) => {
      if (res.ok) {
        return res.json();
      }
      console.log(`Status code : ${res.status}`);
      return null;
    });
    const data = response.prize;
    showLotteryResult(data);
  } catch (error) {
    alert('系統不穩定,請再試一次');
  }
}

// btn 的監聽事件
btn.addEventListener('click', lottery);

@aszx87410 aszx87410 merged commit f83769b into master Jun 15, 2019
@aszx87410 aszx87410 deleted the week10 branch June 15, 2019 19:28

## 前言

相較於上次的心得,這次像是閒話家常,用語比較隨意,內文也不是寫上課內容的筆記,大部分單純就是一個學生的 murmur,但是自己認為內容比上次更充實吧,除了每週的心路歷程以外,還寫了對於 MTR03 目前為止的感想、對幾位同學 code 的心得、心態及學習方法的轉變。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

太好了,我比較喜歡看閒話家常XDD


寫 hw1 時還蠻開心的,因為能做自己喜歡的主題然後弄的漂漂亮亮,很像在上美術課。寫到 hw2 開始切 Medium 版一度懷疑人生,切到一半的時候有想說幹,要不要交基本題就好?不然眼睛有點快炸了,但都切到這個程度了,咬個牙就逼自己繼續切下去了,然後明明 hw2 就切得很痛苦了,卻硬是要寫挑戰題,真的是抖 M。

但這週也不是都痛苦而已啦,我學到 flex 的用法超開心的!以前都用 float 切版簡直是地獄,用 flex 感覺來到新的世界!之後每週切版都用 flex,速度比以前快好幾倍!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flex 讚讚讚


### Week7

開始結合 HTML、CSS、JavaScript 了,我覺得這週蠻難的,因為牽涉到「如何規劃 code 」這件事情,Week2 ~ Week3 我們都在寫 JavaScript 的解題,基本上就是至多兩個 function 可以解決的事情,然後 Week6 剛學到 HTML、CSS,Week7 馬上就要「蹦!」的把全部東西結合在一起,其實有點難度,剛開始寫起來會有種無助感吧,會覺得不知道從何動手。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感謝回饋,看來是我太樂觀了XDD


我規劃 code 的邏輯跟 FE102 的開場有關聯,就是「介面、資料、事件」,所以規劃的方式也是把 function 切成這三個部分,有關渲染畫面的就寫到一個 function 然後切分開來,有關撈資料的就切到另一個 function,啊事件監聽就另外再分開,在 Week7 - Week8 都是用這樣的方式,不敢肯定這種方式正不正確,但覺得還算可以接受,至少回頭看自己的 code 不會頭很痛。

我也是從這週後放棄版面的美觀,專心把心思放在 code 的規劃,本來想說要把版面弄得美美的,之後直接放棄想說隨便抓個配色能看就好,反正固定用 border-radius : 3px 和 transition 搭配 hover 變色做 CSS 效果就可以看起來有點質感了(這是我的切版套路哈哈哈)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

這個讚XD


FE102 難度有點大提升的感覺,但與其說是難度提升不如說省略的資訊太多,比如「什麼是 EventListener」、「 addEventListener 的實作」、都很快速帶過或是沒講到,就像 event(e) 這章節的資訊也很快講過,但我認為可以多講一點 e 這個參數中有什麼資訊、代表了什麼,帶一點模糊的概念和日後的課程做連結。

但我會思考這是有意為之還是無意的? Huli 是故意省略資訊讓學生「自己去找資料理解」,還是這是知識的詛咒所以忽略了呢?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

後者,是知識的詛咒所以忽略了,我自以為講得很清楚了 😂

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

哈哈哈其實我還沒辦法論斷這是好事還壞事,因為這狀況會逼自己去找額外資訊,好像也是提升找各種文件的能力


### Week8

我覺得 Week4 先教 API 是對的方式,到了 Week8 對於撈資料這件事情就可以無痛學習,大致上只要學習 XMLHttpRequest 以及在瀏覽器上面的限制等等的。順帶一提,這週是我玩的最開心的一週!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

這從上一期吸收的經驗XD


這週因為看完指定閱讀還有很多時間,我給自己額外的功課去研究,看了 jQuery 的 $ajax、第二期的 Fetch、Promise 影片還有 async/await 相關的資料,然後就透過作業來實作並熟悉新學的東西。現在想想,用 XMLHttpReqeust 來寫 Week8 作業麻煩很多,自己算是花時間找方法偷懶。

AJAX 的內容我看過六角跟 Huli 的課程,我覺得對於```let request = new XMLHttpRequest```解釋都會讓學生有點疑惑,會不知道為什麼要這樣做,老師可能也不知道如何跟一個沒有 OOP 概念的同學解釋,就會說「就是當作 new 一個 XMLHttpRequest」,這時會想說為什麼要這樣做?然後為什麼我寫 send 它就 send request 了?但為了進度就不管先照做了。所以會推薦 OOP 移到這週也是因為這樣,這些我都到 Week9 和 Week10 看了 OOP 才比較有概念。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

仔細想一想的確是,應該先教 OOP 才對


截至目前為止,以一個沒背景的學生而言,我覺得到 Week7 都處於「剛剛好的量」,大概禮拜三左右可以看完課程和其他相關東西,禮拜四左右開始寫作業,禮拜六左右交作業,禮拜天修 bug 或是下一週。而 Week8 內容偏少, Week9 內容有點多。

不過現在的 Week9 除了課程量稍多以外,內容和作業難度並不會讓初學者覺得絕望,沒那麼容易卡關,以及有 BE101 實戰手把手仔細的教學,都是很好的改動,而且我還沒進行到 Week11 和 12,也就是還沒完整的體驗「整個留言板」,所以意見可能還沒那麼有參考價值。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

week11 跟 12 我自己是預估資訊量 ok 甚至偏少,因為都是前面的延伸,可以等你之後體驗完再來跟我說我的假設是不是正確的XD


MTR03 有一個課綱,這週上前端、下一週上後端等等的,麻煩之處在於「如何規劃課程的密度」,因為時間都一樣,每週要給予學生的課程量就要精準的控制,這也是前兩期一直在調整的地方吧。

截至目前為止,以一個沒背景的學生而言,我覺得到 Week7 都處於「剛剛好的量」,大概禮拜三左右可以看完課程和其他相關東西,禮拜四左右開始寫作業,禮拜六左右交作業,禮拜天修 bug 或是下一週。而 Week8 內容偏少, Week9 內容有點多。
Copy link
Member

@aszx87410 aszx87410 Jun 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

偏少我倒是覺得還行,有挑戰題在那邊可以讓大家做,偏多對我來說問題比較大,因為一定會有很多同學跟不太上


不過現在的 Week9 除了課程量稍多以外,內容和作業難度並不會讓初學者覺得絕望,沒那麼容易卡關,以及有 BE101 實戰手把手仔細的教學,都是很好的改動,而且我還沒進行到 Week11 和 12,也就是還沒完整的體驗「整個留言板」,所以意見可能還沒那麼有參考價值。

然後每週課程的仔細程度我覺得有點差別,比如像是前面 Week7 就比較鬆散隨性,很多資訊可能要自己找,Week9 又會覺得咦這教學有夠仔細欸!可能是根據前兩期卡關的地方來做調整才會有這種差異,算是比較奇妙的感受。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

對, 差不多就是這樣,基本上前人卡關超久的地方,下一期一定會變超詳細


### Spectrum

本來想說應該是類似臉書那樣的形式進行,主要是為了改善第二期社群經營的不足,以及提問會被洗掉的問題,但覺得目前互動性不夠足。問題可能是現在大部分人還是都用 slack 發問或閒聊,心情小語也都發在 Lidemy 學習系統上,Spectrum 雖同時具有兩邊的功能,但同時也被兩邊給取代。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

真的是這樣沒錯,我目前期望到後面課程變複雜時問問題會變得比較困難,spectrum 可以貼圖貼 code 就有優勢,或是到大後期大家出去面試 po 心得文也會有優勢,除此之外我也不期望什麼了XD


我覺得很好,習慣 github flow 以外,可以看同學的 code 棒棒的,提交起來也沒很麻煩,隨時可以透過 tag 看當週每個人的 code 很不錯。

但感覺本來 Huli 是有期待會在上面有更多的互動性吧,比如幫忙抓 bug 或是 code review 等等的,不過現在大家比較像是默默朝聖厲害同學的 code(?)互動性就比較少,我自認蠻用心在看同學的 code 然後偶爾留下 comment 這樣哈哈哈,但因為大部分人都是剛開始寫程式的新手,會有一些顧慮像是「會不會被當作找碴」、「我也很爛,好像沒什麼資格給意見」、「其實也不確定自己現在的觀念是不是正確的」而沒辦法放心給太多意見吧,而我目前最多也只能做到路過亂玩別人作業,幫忙抓 bug 給給回饋。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

原本的期待大概是有去看別人 code 就行了,抓 bug 跟 code review 我有預想到會有你提出的那些顧慮,所以本來就沒什麼期望。總之你現在這樣做很棒,也算是幫我省了一些事情,十分感謝!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

太好了~我無聊時也喜歡看看 code 和別人互動,接下來有空也會繼續到處裝熟給回饋(?)


### Slack

課程大部分的互動都在這,我比較少在上面發言啦,因為問題都累積到每週交作業的時候一次問 Huli,其他人的問題我不一定能回答得出來,通常都靠 Huli 或是助教幫忙,而且覺得 slack 對 markdown 語法支援超鳥 XDD 每次把 code 打上去排版都很醜,就減少在上面發言的動力。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

對話框左邊的加號點下去,有個可以貼 code 的選項

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不過如果是 thread 的回覆,的確怎麼貼都很醜

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

對我就是說 thread 的回覆,不管怎麼整理都醜歪歪,看了就頭很痛哈哈哈

課程大部分的互動都在這,我比較少在上面發言啦,因為問題都累積到每週交作業的時候一次問 Huli,其他人的問題我不一定能回答得出來,通常都靠 Huli 或是助教幫忙,而且覺得 slack 對 markdown 語法支援超鳥 XDD 每次把 code 打上去排版都很醜,就減少在上面發言的動力。

### 複習週
我覺得是很好的安排,因為這課程蠻像很累人的馬拉松,五分之四的時間你都要跑步,如果中途沒有休息站應該會累死人,中途有安排複習週的話,至少在過程中會想著「幹,再撐一下,待會就到補給區了。」然後就會擠出力氣繼續向前了。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

補給區這概念滿不錯的

搞不好嘗試之後發現怎麼那麼簡單(當然也有可能相反)
所以踏出第一步是很重要的,你沒有踏出那一步,就不會知道後面有什麼

我以前超容易放棄的,完全就是容易放棄界的王者,一認為自己不擅長或卡關就馬上撒手不管。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

容易放棄界的王者XDD


啊,我慢慢開始不太容易放棄還跟一個小故事有關係,想在這裡分享。

我申請參加 MTR03 前有跑去申請好想工作室的 Web Camp,那時候面談我的人是 Chris,整體面談氣氛還不錯吧,但我緊張到靠北,寫白板題的時候他出了一題「請你寫 for 迴圈把數字從 1 到 10 累加」,其實就是基本的問題,但我那時候寫的 code 長這樣
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

原來好想還有白板題喔

Copy link
Collaborator Author

@ChihYang41 ChihYang41 Jun 17, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不像是氛圍嚴肅的考試,比較像是跟對方討論技術,然後他說「啊不然你就用白板寫一下」的狀況,就像閒聊一樣

str += i;
}
```
然後對方就露出有點微妙的表情,說:「你寫的 code ...錯的蠻微妙的。」,現在回頭想想我寫的東西,真的是蠻妙的。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我看了看也覺得很妙,你寫了一個結果是對的,但又不能說這 code 是對的的答案

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

喔不對,我上面講的是因為你迴圈從 0 開始,但你 str 初始值是字串,所以結果也會是錯的

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

對,我初始值是字串,然後從 0 開始加,變數名字又怪怪的,不知道在寫什麼東西哈哈哈

```
然後對方就露出有點微妙的表情,說:「你寫的 code ...錯的蠻微妙的。」,現在回頭想想我寫的東西,真的是蠻妙的。

面談結束前我問 Chris,你們篩選人的標準是什麼呢?他說了大概是「自學能力」、「對問題的執著度」、「表達能力」、「是不是程式狂熱者」等等的。那時候就心想哦...「那你們覺得我怎樣?」 ,對方回:「對問題執著度..就一般人 XD」
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感覺好想最看重的應該是你夠不夠有毅力夠不夠執著,從上面你對自己的描述看起來,似乎不太符合XD

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

應該是喔,那時候他說其他地方表現不錯,執著力普通,很有可能就是因為這樣哈哈


但是幹,我不想就這樣放棄,所以就開始著手報名 MTR03,開始寫 Scratch 遊戲、執著要拼完 codewars 所有題目(不過沒拼完),而後把報名信寄出去。只能說這次經驗有刺激到我吧,莫名的激起一股好勝心跟不服輸的心態。

這不是黑特文,我很感謝 Chirs 以及好想工作室願意給這次機會,沒有踏出這一步或是被刷掉的經驗,說不定我對 MTR03 報名不會那麼有衝勁,對寫程式可能也就隨隨便便,所以對 Huli 那段話蠻有感觸的,而自己透過這次經歷想補充的話是「踏出第一步嘗試後可能覺得超困難,但這可能會刺激你後面多踏出兩百步」
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感謝好想工作室 <(_ _)>
我七八月會去那邊一趟


另外把問題形容的具體我覺得很重要,不要讓提問太意識流。找過什麼文件、自己做了什麼、有 code 的問題就貼 code,這樣對方才能確切了解情況幫忙解決。

關於語氣,我記得 Huli 有說過不要預想對方的語氣是壞的,當作「友善的交流」,而我覺得「讓文字就算是透過機器也能感受到溫度」也蠻重要的,所以會盡量讓自己的提問或是糾錯時的語氣讓對方感受到和善。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

其實有這預設是因為我覺得有時候我改作業只看文字的話可以有很多種解釋,例如說:「你為什麼要加這個?」
可以想成很兇的提問,或也可以想成單純的疑問
大部份時候是後者,所以才會跟大家說先預設成後者就對了

另一個原因是這其實可以透過表情符號來改善,但有時候我懶得加,例如說:「你為什麼要加這個 XD?」、「你為什麼要加這個 😂」

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

哦哦對,其實在計劃剛開始講這個還不錯,避免很多誤會,不過習慣計劃進行流程之後,就會進入就事論事模式,不會預想對方語氣了哈哈

### ishin1554

### 至目前的印象
一位追不到車尾燈的同學,瀟灑又飄逸,不知道會飛去哪裡,當我交出 Week 7 作業時,看到他已經在把 Week7 的 code 重構了,那時候還看不懂 OOP 在幹嘛,想說這用法也太奧妙。然後他花的時間真的有夠多,還用心到自己寫 side project 紀錄時間,超誇扯,想說這位同學是有十個肝可以用嗎?但也感謝有這位同學讓我每天都不敢鬆懈,逼自己要上進。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

第一期有 kris,唯一跟得上進度的同學;第二期有 LinY,超前進度,只學了四個月就找到工作;第三期大概就是她了。

偷偷給你看一篇她的報導XD
https://blog.hahow.in/humans-of-hahow-weimin-just-do-it/

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

真的是強者我同學!!

this.msg = msg;
}
```
用法就是把各獎項抽獎結果塞進去 constructor 中,寫法我認為蠻像 [MDN 給的範例](https://developer.mozilla.org/zh-TW/docs/Learn/JavaScript/Objects/Object-oriented_JS#%E5%BB%BA%E7%AB%8B%E5%AE%8C%E6%95%B4%E7%9A%84%E5%BB%BA%E6%A7%8B%E5%AD%90) ,Huli 的說法則是這樣蠻不直覺的。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我後來有看你貼的範例,其實仔細想一想搞不好是必要之惡(?),就是看起來不順眼,但好像也沒什麼更好的方法

### yakim-hsu

### 至目前的印象
一位感覺大家都在關注的同學,常常在學習系統看到別人寫到她名字,各方人馬都說看她的 code 受益良多,也是我定期會關注她作業的同學。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

各方人馬XDD

### 至目前的印象
一位感覺大家都在關注的同學,常常在學習系統看到別人寫到她名字,各方人馬都說看她的 code 受益良多,也是我定期會關注她作業的同學。

作業版面之美不用多說,code 的規劃也很好,而且基本作業、進階挑戰、超級挑戰都會寫,完成度都高到令人咋舌,真的是不知道在猛幾點的。另外她 Week8 作業開始用 OOP 實作我也覺得棒棒的,很有實驗精神之外也很願意挑戰吧。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

其實她原本就是工程師,只是離職一段時間後東西有點忘記怎麼寫 code,但功力依舊在

Copy link
Collaborator Author

@ChihYang41 ChihYang41 Jun 17, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

又一個強者我同學,每個都臥虎藏龍就是了 XD

}
}
```
覺得蠻酷的欸~而且也蠻易讀的,不知道是不是我見識淺薄,把參數這樣用對我來說挺特別的,比我當初想要寫的 code 還要簡單易讀很多 QQ
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我自己也滿喜歡這樣用的,可以學起來

```
覺得蠻酷的欸~而且也蠻易讀的,不知道是不是我見識淺薄,把參數這樣用對我來說挺特別的,比我當初想要寫的 code 還要簡單易讀很多 QQ

## Week10 小遊戲
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

可以玩玩另一個:https://r30challenge.herokuapp.com/

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是 minw 寫的欸好猛,目前玩到第二關,之後有破關的話來寫個心得 !

@ChihYang41
Copy link
Collaborator Author

OOP 的部分你現在感覺只是把 function 換成物件導向裡的 method 而已,仔細看你就會發現差異不大,twtich 那題我改一下給你看,讓你參考一下什麼叫做方便重複使用:

class TwitchAPI {
  constructor(clientId) {
    this.baseUrl = 'https://api.twitch.tv/kraken'
    this.clientId = clientId;
  }

  sendRequest(url) {
    const headers = new Headers({ 'Client-Id': this.clientId });
    const myInit = { headers };
    return fetch(this.baseUrl + url, myInit).then((res) => {
      if (res.ok) {
        return res.json();
      }
      return null;
    });
  }

  getPopularGames() {
    const url = '/games/top?limit=5';
    return this.sendRequest(url);
  }

  getLiveStreams(gameName, offset) {
    const url = `/streams/?game=${gameName}&limit=20&offset=${offset}`;
    return this.sendRequest(url);
  }
}

const twitchApi = new TwitchAPI('z97jvca5asox81v22jbb24eziykct5');

// 用的時候
const response = await twitchApi.getPopularGames();
const response2 = await twitchApi.getLiveStreams('LOL', 10);

完全同意,我寫完感覺自己只是 function 的搬運工而已哈哈哈哈,本質上沒什麼差別。很感謝這個示範,比原本好很多,我參考一下這個示範回去想想該怎麼寫

@ChihYang41
Copy link
Collaborator Author

ChihYang41 commented Jun 17, 2019

抽獎那題 Prize 應該只當作一個容器(?)拿來放資料比較好,顯示的部分可以切開,而且可以盡量避免全域變數,改完大概會長這樣(沒有完全改好,意思有到就好):

關於這邊我有兩個疑惑:

  1. 為什麼會牽涉到全域變數呢?
    我本來以為是 constructor 內的 this 會指向 window ,因為我記得 Huli 的影片解釋
class Person {
  constructor (name) {
    this.name = name;
  }
}

在 JavaScript 運作的方式其實是像

function Person(name) {
    this.name = name;
}

所以以為因為是 this 在 function 內,指向 window,所以會污染全域。

後來研究了一下 this 和 prototype ,看了這篇文章鐵人賽:JavaScript 的 this 到底是誰? 發現好像跟我想的不一樣,在 new 的時候 this 會指向物件本身,想請問為什麼會牽涉到全域呢?

  1. 看完 給OOP初學者的建議:先搞懂「資料跟行為在一起」就好,其它的慢慢來,他的 Q&A 第一題說到:

Q&A
Q1:我常常設計一些類別,只有資料沒有行為,聽起來OK嗎?

不OK,這很不OOP,而且沒意義。
乾脆直接用關聯式陣列去表示那些資料就好。

我以為只放資料的 class 很不 OOP,把資料和行為在一起比較好,但這邊是把 Prize 當容器,我還蠻疑惑的,class 要依照怎麼樣的方式來寫比較好呢?

@aszx87410
Copy link
Member

關於第一個問題,this 指到哪裡可參考:

  1. 該來理解 JavaScript 的原型鍊了 aszx87410/blog#18
  2. 淺談 JavaScript 頭號難題 this:絕對不完整,但保證好懂 aszx87410/blog#39

我指的全域變數是你本來 showPrize 那個方法,裡面直接去使用了外部的變數,這樣這個 class 就跟外部有了依賴性,就沒辦法很好的重用。意思就是哪天你朋友想用,沒辦法直接複製過去使用,外面還需要宣告一些東西才行

第二個問題,我覺得只放資料還行啊XDD 如果想要把行為再放進去,就是把顯示獎項的 method 也寫進去,但是要顯示的地方要從外部傳進去,例如說:

class Prize {
  constructor(title, imgUrl, bgClass) {
    this.title = title;
    this.imgUrl = imgUrl;
    this.bgColorClass = bgClass;
  }

  showPrizeResult(wrapper, lotteryTitle, lotteryImage) {
    lotteryTitle.innerText = prize.title;
    lotteryImage.src = prize.imgUrl;
    wrapper.classList.add(prize.bgColorClass);
  }
}

const body = document.querySelector('body');
const lotteryTitle = document.querySelector('.title');
const lotteryImage = document.querySelector('.lottery__image');

const firstPrize = new Prize('恭喜你中頭獎了!日本東京來回雙人遊!', 'http://pixelartmaker.com/art/cec844662085081.png', 'first__prize__background')
firstPrize.showPrizeResult(body, lotteryTitle, lotteryImage)

@ChihYang41
Copy link
Collaborator Author

ChihYang41 commented Jun 18, 2019

第一個問題

原來如此,理解跟外部有依賴性的意思了,另外感謝提供 this 的資料,昨天為了理解 prototype 和 this ,看文章看得有點累 XD

第二個問題

咦真的嗎 XDD 因為這是 Week9 指定閱讀的文章,我以為算是 Huli 部分的觀點哈哈,既然知道這樣沒問題就放心了。

另外如果改成顯示獎項的 method 也寫進去,感覺又回到 class 跟外部有依賴性的問題了嗎?因為會用到外部的變數。目前覺得原本把 showPrize 移出去變成一個 function 似乎比較好

@aszx87410
Copy link
Member

不會喔,你看像我這樣改寫,就沒有用到外部變數,都是靠參數傳進去的

@ChihYang41
Copy link
Collaborator Author

有了,看懂了!仔細看才發現是傳參數進去,是我眼花 QQ 感謝 Huli

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants